日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces 1181

發布時間:2024/9/5 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 1181 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1181 B

題意

一個高精整數,要把它從中間割開分成兩部分,每一部分不能為空也不能有前導零,問如何才能使得兩部分的和最小。

Examples

input
7
1234567
output
1801
input
3
101
output
11

打高精好點煩的
就均分成兩半,再判一判前導零就好了。

1181 C

題意

旗幟的定義:
這些是旗幟:


這些不是旗幟:





現在給你一個英文字母矩陣,問有多少個子矩形是旗幟。 \((n,m\le 1000)\)

Examples

input
4 3
aaa
bbb
ccb
ddd
output
6
input
6 1
a
a
b
b
c
c
output
1
input
4 3
aca
ccc
bbb
aaa
output
8

弄一個雙端隊列模擬即可。
細節較多。

Code

#include<bits/stdc++.h> using namespace std; typedef pair<char,int> P; const int maxn=1003,INF=1050000000; char s[maxn]; int n,m; long long ans; deque<P> a[maxn]; bool valid(const deque<P> &q){return q.size()==3&&q[0].second>=q[1].second&&q[1].second==q[2].second; } bool equal(const deque<P> &q1,const deque<P> &q2){if(q2.size()!=3)return 0;for(int i=0;i<=2;i++)if(q1[i].first!=q2[i].first)return 0;return q1[1].second==q2[1].second&&q1[2].second==q2[2].second; } int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",s+1);for(int j=1;j<=m;j++){if(a[j].size()>=1&&a[j].back().first==s[j])a[j].back().second++;else a[j].push_back(P(s[j],1));while(a[j].size()>=2&&a[j].back().second>a[j][a[j].size()-2].second)a[j].pop_front();if(a[j].size()>=4)a[j].pop_front();}for(int l=1,r=1;r<=m;l=r){for(;l<=m&&!valid(a[l]);l++);for(r=l;r<=m&&valid(a[r])&&equal(a[l],a[r]);r++);ans+=(long long)(r-l)*(r-l+1)/2;}}printf("%lld\n",ans);return 0; }

1181 D

題意

\(m\) 個城市,每年舉辦比賽。在最先的 \(n\) 年中比賽的舉辦地是已知的,后來制定了規則,每年以每個城市之前舉辦次數為第一關鍵字,以每個城市的編號為第二關鍵字,選擇最小的城市舉辦比賽。現在有 \(q\) 個詢問,每次詢問第 \(x_i\) 年由哪個城市舉辦。 \((1\le n,m,q\le 5*10^5,x_i\le 10^{18})\)

Examples

input
6 4 10
3 1 1 1 2 2
7
8
9
10
11
12
13
14
15
16
output
4
3
4
2
3
4
1
2
3
4
input
4 5 4
4 4 5 1
15
9
13
6
output
5
3
3
3

模擬發現,經過 \(O(n^2)\) 年,舉辦城市必定會變成 \(1,2,\dots ,m\) 的順序。
因此,在臨界值之后的詢問很容易得出結果。
在臨界值之前的詢問呢?
考慮將每個城市按上述兩個關鍵字排序,然后對于每個第一關鍵字相等的區間設它們為 \([l_i...r_i](r_i+1=l_{i+1},l_1=1)\) 我們發現舉辦城市的順序就是:

  • \(1\)\(r_1\) 輪流,進行 \(cnt[l_2]-cnt[1]\) 遍;
  • \(\dots\)
  • \(1\)\(r_{i+1}\) 輪流,進行 \(cnt[l_{i+2}]-cnt[l_{i+1}]\) 遍;
  • \(\dots\)
  • \(1\)\(r_{k-1}\) 輪流,進行 \(cnt[l_k]-cnt[l_{k-1}]\) 遍;
  • \(1\)\(m\) 輪流,進行 \(∞\) 遍(這是臨界值之后)。

每次相當于一輪輪完之后把 \([1,r_i]\)\([l_{i+1},r_{i+1}]\) 合并。
\(n^2\) 歸并顯然是不行的,因此我們用一種數據結構來實現每個城市的名次查詢。

Code

#include<bits/stdc++.h> using namespace std; typedef pair<int,int> P; typedef pair<long long,int> QQ; const int maxn=500003,INF=1050000000; P a[maxn]; QQ q[maxn]; int n,m,Q,ans[maxn],t[maxn<<2]; int mod(long long x,int y){return x%y==0?y:x%y;} void change(int p,int l,int r,int pos){if(l==r){t[p]++;return;}int mid=(l+r)>>1;if(pos<=mid)change(p<<1,l,mid,pos);else change(p<<1|1,mid+1,r,pos);t[p]=t[p<<1]+t[p<<1|1]; } int kth(int p,int l,int r,int rnk){if(l==r)return l;int mid=(l+r)>>1;if(rnk<=t[p<<1])return kth(p<<1,l,mid,rnk);else return kth(p<<1|1,mid+1,r,rnk-t[p<<1]); } int main(){scanf("%d%d%d",&n,&m,&Q);for(int i=1;i<=n;i++){int x;scanf("%d",&x);a[x].first++;}for(int i=1;i<=m;i++)a[i].second=i;sort(a+1,a+m+1);for(int i=1;i<=Q;i++)scanf("%lld",&q[i].first),q[i].second=i;sort(q+1,q+Q+1);int l,r,pos;long long now=n,nxt;for(l=1,r=1,pos=1;;l=r){for(;r<=m&&a[r].first==a[l].first;r++)change(1,1,m,a[r].second);if(r>m)break;nxt=now+(long long)(a[r].first-a[l].first)*(r-1);for(;pos<=Q&&q[pos].first<=nxt;pos++){ans[q[pos].second]=kth(1,1,m,mod(q[pos].first-now,r-1));}now=nxt;}for(;pos<=Q;pos++){ans[q[pos].second]=mod(q[pos].first-now,m);}for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);return 0; }

轉載于:https://www.cnblogs.com/BlogOfchc1234567890/p/11051532.html

總結

以上是生活随笔為你收集整理的Codeforces 1181的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。