Codeforces Round #262 (Div. 2)
A
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 100000 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 int n,m; 18 int main() 19 { 20 int n,m,i,j; 21 cin>>n>>m; 22 if(m>n) 23 cout<<n<<endl; 24 else 25 { 26 int o = 0; 27 while(n) 28 { 29 n--; 30 o++; 31 if(o%m==0) n++; 32 } 33 cout<<o<<endl; 34 } 35 return 0; 36 }
B
枚举和值
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 100000 12 #define LL long long 13 #define INF 0xfffffff 14 #define M 1000000000 15 const double eps = 1e-8; 16 const double pi = acos(-1.0); 17 const double inf = ~0u>>2; 18 int o[N]; 19 int judge(LL x) 20 { 21 int ans = 0; 22 while(x) 23 { 24 ans+=x%10; 25 x/=10; 26 } 27 return ans; 28 } 29 int main() 30 { 31 int a,b,c,i,j; 32 cin>>a>>b>>c; 33 int g = 0; 34 for(i = 1; i <= 100 ; i++) 35 { 36 LL k = (LL)b*pow(i*1.0,a)+c; 37 if(judge(k)==i&&k>0&&k<M) 38 o[++g] = k; 39 } 40 cout<<g<<endl; 41 if(g) 42 { 43 44 45 sort(o+1,o+g+1); 46 for(i = 1; i < g ; i ++) 47 cout<<o[i]<<" "; 48 cout<<o[i]<<endl; 49 } 50 return 0; 51 }
C
二分高度,之后用高度减去原有高度,就可以知道每株花被浇了多少水,用线段树维护一下就可以得到最少浇水的次数。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 100010 12 #define LL long long 13 #define INF 0xfffffff 14 #define M 1000200000 15 const double eps = 1e-8; 16 const double pi = acos(-1.0); 17 const double inf = ~0u>>2; 18 int a[N],o[N]; 19 LL s[N<<2]; 20 int n,m,w; 21 void build(int l,int r,int w) 22 { 23 s[w] = 0; 24 if(l==r) 25 { 26 s[w] = o[l]; 27 return ; 28 } 29 int m = (l+r)>>1; 30 build(l,m,w<<1); 31 build(m+1,r,w<<1|1); 32 } 33 void down(int w,int m) 34 { 35 if(s[w]) 36 { 37 s[w<<1] += s[w]; 38 s[w<<1|1] += s[w]; 39 s[w] = 0; 40 } 41 } 42 void update(int a,int b,int d,int l,int r,int w) 43 { 44 if(a<=l&&b>=r) 45 { 46 s[w]+=d; 47 return ; 48 } 49 down(w,r-l+1); 50 int m = (l+r)>>1; 51 if(a<=m) update(a,b,d,l,m,w<<1); 52 if(b>m) update(a,b,d,m+1,r,w<<1|1); 53 } 54 LL query(int p,int l,int r,int w) 55 { 56 if(l==r) 57 return s[w]; 58 down(w,r-l+1); 59 int m = (l+r)>>1; 60 if(p<=m) return query(p,l,m,w<<1); 61 else return query(p,m+1,r,w<<1|1); 62 } 63 int cal(int k) 64 { 65 int i,j; 66 for(i = 1; i <= n; i++) 67 if(k>a[i]) o[i] = k-a[i]; 68 else o[i] = 0; 69 build(1,n,1); 70 LL num = 0; 71 for(i = 1; i <= n; i++) 72 { 73 int pp = query(i,1,n,1); 74 75 76 if(pp>0) {update(i,min(n,i+w-1),-pp,1,n,1);num+=pp;} if(num>m) return 0; 77 } 78 if(num<=m) return 1; 79 return 0; 80 } 81 int main() 82 { 83 int i,j; 84 cin>>n>>m>>w; 85 for(i = 1; i <= n; i++) 86 scanf("%d",&a[i]); 87 int low = 1,high = M,mid; 88 int ans = 1; 89 while(low<=high) 90 { 91 mid = (low+high)>>1; 92 if(cal(mid)==0) 93 high = mid-1; 94 else 95 { 96 low = mid+1; 97 ans = max(ans,mid); 98 } 99 } 100 cout<<ans<<endl; 101 return 0; 102 }
D
对于
k=1 ,ans = L。
连续偶奇异或是为1的 比如10 11 12 13等 ,而奇偶则是不一定的
k= 2, 如果l%2==0,ans = L^(L+1)=1 ,否则要根据R-L+1的取值决定
k= 4 ,如果L%2=0,ans = L^(L+1)^(L+2)^(L+3) = 0,否则如果R-L+1>4 也是为偶奇偶奇=0的,若R-L+1=4 就可转化为3的时候做。
k=3 ,有可能为1也有可能为0 ,假设L-R范围内的三个数x,y,z异或为0,x,y,z不同,就设x>y>z,那么x,y已确定,那么就是尽可能让z大,
比如
x 100110001111 那么y值的第一位一定为1,不然z就为1就不符合假设y>z了,因为y<x,所以之后遇到x为0的位,y,z也是为0的,一旦再遇到一位1,就可以把y置为0,z置为1,再之后z就可以一直为1,而y的变化可以依据x,z而定。
x 100110001111...1
y 100001110000...0
z 000111111111...1
这样z将获得<R的最大值,再与L相比较就可以知道结果了。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 100000 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 LL a[10]; 18 int di[50]; 19 void judge(LL l,LL r) 20 { 21 LL x = r; 22 LL i; 23 int g = 0; 24 while(x) 25 { 26 di[g++] = x%2; 27 x/=2; 28 } 29 LL y = 0; 30 LL z = 0; 31 int flag = 0; 32 y+=((LL)1<<(g-1)); 33 for(i = g-2 ; i >= 0 ; i--) 34 { 35 if(di[i]) 36 { 37 flag = 1; 38 z += ((LL)1<<i); 39 } 40 else if(flag) 41 { 42 z+=((LL)1<<i); 43 y+=((LL)1<<i); 44 } 45 } 46 if(z>=l) 47 { 48 cout<<"0\n"; 49 cout<<"3\n"; 50 cout<<r<<" "<<y<<" "<<z<<endl; 51 } 52 else 53 { 54 cout<<"1\n"; 55 cout<<"2\n"; 56 if(l%2) 57 cout<<l+1<<" "<<l+2<<endl; 58 else 59 cout<<l<<" "<<l+1<<endl; 60 } 61 } 62 int main() 63 { 64 LL l,r,i,k; 65 cin>>l>>r>>k; 66 if(r==l) 67 { 68 cout<<l<<endl; 69 cout<<"1\n"; 70 cout<<l<<endl; 71 return 0; 72 } 73 if(l%2==0) 74 { 75 if(r-l+1==2||k<=2) 76 { 77 if(k==1) 78 { 79 cout<<l<<endl; 80 cout<<"1\n"; 81 cout<<l<<endl; 82 } 83 else 84 { 85 cout<<"1\n"; 86 cout<<"2\n"; 87 cout<<l<<" "<<l+1<<endl; 88 } 89 } 90 else if(r-l+1==3||k==3) 91 { 92 judge(l,r); 93 } 94 else 95 { 96 cout<<"0\n"; 97 cout<<"4\n"; 98 for(i = l ; i < l + 4 ; i++) 99 cout<<i<<" "; 100 puts(""); 101 } 102 } 103 else 104 { 105 if(r-l+1==2||k<=2) 106 { 107 if(k==1||(r-l+1==2&&(l^(l+1))>l)) 108 { 109 cout<<l<<endl; 110 cout<<"1\n"; 111 cout<<l<<endl; 112 } 113 else 114 { 115 if(r-l+1==2) 116 { 117 cout<<(l^(l+1))<<endl; 118 cout<<"2\n"; 119 cout<<l<<" "<<l+1<<endl; 120 } 121 else 122 { 123 cout<<"1\n"; 124 cout<<"2\n"; 125 cout<<l+1<<" "<<l+2<<endl; 126 } 127 } 128 } 129 else if(r-l+1==3||k==3) 130 { 131 judge(l,r); 132 } 133 else if(r-l+1==4) 134 { 135 int flag = 0; 136 judge(l,r); 137 } 138 else 139 { 140 cout<<"0\n"; 141 cout<<"4\n"; 142 for(i = l+1 ; i < l+5 ; i++) 143 cout<<i<<" "; 144 puts(""); 145 } 146 147 } 148 return 0; 149 }