题意
题解
代码
#include
#include
using namespace std;
//ceil(n/k)==(n+k-1)/k
//floor(n/k)==n/k;
void solve() {
int n; cin>>n;
cout<<int(ceil(n/2.0))<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
题意
题解
代码
#include
#include
#include
using namespace std;
map<char,int> h;
int n;
void solve() {
cin>>n;
string s; cin>>s;
int res=0;
for(int i=0;i<n;i++) {
h.clear();
bool f=1;
int kinds=0,ma=0,ans=0;
for(int j=i;f && j<n & j<=i+100;j++) {
if(h[s[j]]==0) kinds++;
h[s[j]]++;
ma=max(ma,h[s[j]]);
if(ma<=kinds) ans++;
}
res+=ans;
}
cout<<res<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
题意
题解
代码
正着遍历(添加一个虚空的n+1边界,使得S数组被不重不漏的分为若干段,同时避免恶心讨论)
#include
#include
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,a[N],pos[N];
ll s[N];
void solve() {
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++) {
cin>>a[i],s[i]=s[i-1]+a[i];
if(a[i]==0) pos[cnt++]=i;
}
pos[cnt++]=n+1;
ll res=0;
for(int i=0;i<cnt;i++) {
ll ans=0;
if(i==0) {
for(int j=1;j<pos[0];j++) if(s[j]==0) ans++;
}
else {
int j=pos[i-1],k=pos[i];
map<ll,ll> h;
ll ma=0;
for(int x=j;x<k;x++) {
h[s[x]]++;
if(h[s[x]]>ma) ma=h[s[x]];
}
ans=ma;
}
res+=ans;
}
cout<<res<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
逆着遍历(与上述添加n+1同理,但是这里更加的简单,只需统计碰到0时那一段的S最多次数,而第一段没有0,所以不会按这个方法统计,避免讨论,只要最后加上Si=0的数量)。注意#define long long int 会re
#include
#include
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,a[N];
ll s[N];
void solve() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
ll res=0;
map<ll,ll> h;
for(int i=n;i>=1;i--) {
h[s[i]]++;
if(a[i]==0) {
ll ma=0;
for(auto x:h) if(x.second>ma) ma=x.second;
res+=ma;
h.clear();
}
}
cout<<res+h[0]<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
题意
题解
代码
直接用int64_t
#include
using namespace std;
void solve() {
int64_t a,b,d; cin>>a>>b>>d;
a|=b;
int cntz=0;
while(d%2==0) {
if(a%2) { cout<<-1<<'\n'; return ;}
d/=2; a/=2;
cntz++;
}
int64_t x=0;
for(int i=0;i<30;i++) {
if((x>>i & 1)==0 && (a>>i & 1)==1) x+=d<<i;
}
cout<<(x<<cntz)<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}
用long long 取模来构造一个范围符合要求的答案
#include
using namespace std;
const long long mod=11529215e11;//2^60的值
void solve() {
long long a,b,d; cin>>a>>b>>d;
a|=b;
int cntz=0;
while(d%2==0) {
if(a%2) { cout<<-1<<'\n'; return ;}
d/=2; a/=2;
cntz++;
}
long long x=0;
for(int i=0;i<30;i++) {
if((x>>i & 1)==0 && (a>>i & 1)==1) x=(x+(d<<i)+mod)%mod;
}
cout<<(x<<cntz)<<'\n';
}
int main() {
int t; cin>>t;
while(t--) solve();
return 0;
}