昨夜アップ(CF評価208を戦うために
問題の解決について書きます:
:要件Aのすべての丸めと仮定し、サブタイトルを送ります。> 0は、0が正の整数の一部に入れ<場合、丸め、負の数、に入れた場合。
1の#include <stdio.hの>
2 の#defineがINTレジスタ
3 の#define ILインライン
4 のconst int型 = N 1000005を。
5 INT [N]、N、B [N]、合計。
6のIL ボイド FR(INT&NUM){
7 NUM = 0。チャー C = GETCHAR()。int型のp = 1 ;
8 一方、(C < ' 0 ' || C> ' 9 ')C == ' - '?P = - 1、C = GETCHAR():C = GETCHAR()。
9 一方、(C> = ' 0 ' && C <= ' 9 ')NUM = NUM * 10 + C- ' 0 '、C = GETCHAR()。
10 NUM * = P。
11 }
12 INT メイン(){
13個の FR(N)。
14 のために(それi = 1 ; iが<= N; I ++)FR([i])と、[i]は[I] / = B 2の合計+ =、B [i]は、
15 であれば(!{和)
16 のために(それi = 1 ; iが<= N; ++ I)のprintf("%D \ n " 、[I])B;
17 リターン 0 ;
18 }
19 のために(これはi = 1 ; iが<= N; ++ I)
20 であれば([I]%2 ){
21 であれば(A [I] < 0 &&合計は> 0)[i]は、-B- - 合計を、
22 であれば([I]> 0 &&和< 0)++ B [i]は、++ 和;
23 }
24 のための(それはi = 1 ; iが<= N; ++ i)を
25 のprintf(" %d個の\ n " 、B [I])。
26 リターン 0 ;
27 }
B:サブタイトルを送信し、あれば、元の配列内のこの数よりも少ない少数の数の数よりも前方として、それは微細に必要であることは明らかです。フェンウィックツリーさりげなく、より良い書きます。
1の#include <stdio.hの>
2 の#defineがINTレジスタ
3 の#define ILインライン
4 のconst int型 = N 1000005を。
5 INT [N]、N、B [N]、O、T [N]、POS [N]。
6のIL ボイド FR(INT&NUM){
7 NUM = 0。チャー C = GETCHAR()。int型のp = 1 ;
8 一方、(C < ' 0 ' || C> ' 9 ')C == ' - '?p = -1、C = GETCHAR():C = GETCHAR()。
9 一方、(C> = ' 0 ' && C <= ' 9 ')NUM = NUM * 10 + C- ' 0 '、C = GETCHAR()。
10 NUM * = P。
11 }
12 ILの空隙追加{(それNUM、X)
13 一方(X <= N)T [X] + = NUM、X + =(X& - X)。
14 }
15、IL 空隙 CAL(これをx、int型&今){
16 今や= 0 。
17 しばらく(X)は+ = T [X]、X - =(X& - X)。
18 }
19 INT メイン(){
20個の FR(N)。
21 のために(私はそれ= 1 ; iが<= N; ++ I)FR([i])と、POS [I] = I。
22 のために(それI = 1、ANS = 0 ++; iが<= N I){
23個の FR(B [I])。
24 CAL(POS、ANS [I] B])。
25 であれば(ANS <POS [B [I]] - 1)++ O;
26 追加(POS [B [I]、1 )。
27 }
28 のprintf(" %d個" 、O)。
29 リターン 0 ;
30 }
C:私は違い何の本当に簡単と難しいのバージョンを知りません。。同じシーケンス毎回同じ第1平面のx次いでペアワイズ取り消し、キャンセル前部、上部、および底部面とキャンセルで、同じ平面の行、。ダブル経験はそれらをオフにつかみます。
1 #include<stdio.h>
2 #include<algorithm>
3 #define it register int
4 #define il inline
5 using namespace std;
6 const int N=100005;
7 int n,cnt,tot;
8 struct ky{
9 int x,y,z,id;
10 }a[N],o[N],tp[N],tpx[N];
11 il bool cmp(ky p,ky q){
12 return p.z<q.z;
13 }
14 il bool cmp2(ky p,ky q){
15 return p.x^q.x?p.x<q.x:p.y<q.y;
16 }
17 il void fr(int &num){
18 num=0;char c=getchar();int p=1;
19 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
20 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
21 num*=p;
22 }
23 int main(){
24 fr(n);
25 for(it i=1;i<=n;++i) fr(a[i].x),fr(a[i].y),fr(a[i].z),a[i].id=i;
26 sort(a+1,a+1+n,cmp);
27 for(it i=1,j;i<=n;){
28 cnt=0;for(j=i;j<=n&&a[j].z==a[i].z;++j) tp[++cnt]=a[j];
29 sort(tp+1,tp+1+cnt,cmp2);
30 it now=0;
31 for(it x=1,y;x<=cnt;){
32 for(y=x;y<=cnt&&tp[y].x==tp[x].x;++y);
33 if((y-x)&1) tpx[++now]=tp[x],++x;
34 for(it tx=x;tx<y;tx+=2) printf("%d %d\n",tp[tx].id,tp[tx+1].id);
35 x=y;
36 }
37 if(now&1) o[++tot]=tpx[now],--now;
38 for(it x=1;x<=now;x+=2) printf("%d %d\n",tpx[x].id,tpx[x+1].id);
39 i=j;
40 }
41 for(it i=1;i<=tot;i+=2) printf("%d %d\n",o[i].id,o[i+1].id);
42 return 0;
43 }
D:很显然只要循环两次以上就会造成死循环,手玩一下样例就行。然后开个三倍数组写个RMQ,每次算一下记一下这个点可以拓展的最远点,下次就从这个最远点开始往后拓展。
1 #include<stdio.h>
2 #include<math.h>
3 #define it register int
4 #define il inline
5 using namespace std;
6 const int N=1000005;
7 int n,a[N],f[N][22],m,len[N];
8 il int Max(it p,it q){
9 return p>q?p:q;
10 }
11 il int Q(it l,it r){
12 it k=log2(r-l+1);//printf("l=%d r=%d Q=%d\n",l,r,Max(f[l][k],f[r-(1<<k)+1][k]));
13 return Max(f[l][k],f[r-(1<<k)+1][k]);
14 }
15 il void fr(int &num){
16 num=0;char c=getchar();int p=1;
17 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
18 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
19 num*=p;
20 }
21 int main(){
22 fr(n),m=n;
23 for(it i=1;i<=n;++i) fr(a[i]),a[i+n]=a[i+n+n]=a[i],f[i][0]=f[i+n][0]=f[i+n+n][0]=a[i];
24 n*=3;
25 for(it j=1;(1<<j)<=n;++j)
26 for(it i=1;i+(1<<j)-1<=n;++i)
27 f[i][j]=Max(f[i+(1<<j-1)][j-1],f[i][j-1]);
28 it l=1,r=1;
29 for(it i=1;i<=m;++i){
30 r=Max(r,i);
31 while(r+1<=n&&a[r+1]*2>=Q(i,r)) ++r;
32 len[i]=(r-i+1);
33 }
34 for(it i=1;i<=m;++i) printf("%d ",len[i]>2*m?-1:len[i]);
35 return 0;
36 }