思路:分类/输入/输出
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
void solve()
{
int x;cin>>x;
if(x<=1399)cout<<"Division 4"<<endl;
else if(x>=1400&&x<=1599)cout<<"Division 3"<<endl;
else if(x>=1900)cout<<"Division 1"<<endl;
else cout<<"Division 2"<<endl;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}
思路:记录并输出第一个出现第三次的值即可
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
map<int,int>mp;
void solve()
{
int n;cin>>n;
int ans=-1;
mp.clear();
for(int i=1;i<=n;i++)
{
int x;cin>>x;
mp[x]++;
if(mp[x]>=3)ans=x;
}
if(ans!=-1)cout<<ans<<endl;
else cout<<ans<<endl;
return ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}
思路:
找下是否奇数和偶数都出现在了 奇数位置或者偶数位置.
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
int n;
bool check(vector<int>a,int sta)
{
if(sta)
{
bool ok1=false,ok2=false;
for(int i=2;i<=n;i+=2)
if(a[i]%2!=0)ok1=true;
else ok2=true;
if(ok1&&ok2)return true;
else return false;
}else
{
bool ok1=false,ok2=false;
for(int i=1;i<=n;i+=2)
if(a[i]%2!=0)ok1=true;
else ok2=true;
if(ok1&&ok2)return true;
else return false;
}
}
void solve()
{
cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
if(check(a,1)||check(a,0))cout<<"NO"<<endl;
else cout<<"YES"<<endl;
return ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}
思路:
由于每次只能搞出两个字符,且无法消掉一个.因此可以染色的部分长度必须>1
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
void solve()
{
int n;cin>>n;
string s;cin>>s;
int l=0,r;
while(s[l]=='W'&&l<s.size())l++;
r=l;
while(l<s.size())
{
while(s[r]!='W'&&r<s.size())r++;
set<char>st;
for(int i=l;i<r;i++)st.insert(s[i]);
if(st.size()==1)
{
cout<<"NO"<<endl;
return ;
}
while(s[r]=='W'&&r<s.size())r++;
l=r;
}
cout<<"YES"<<endl;
return ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}
思路:由于字符串的实际种类非常小.因此每次只需要遍历所有种类的字符串和当前的进行比较即可.
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
map<string,int>mp;
set<string>st;
int g[26][26];
void solve()
{
memset(g,0,sizeof g);
int n;cin>>n;
ll ans=0;
for(int i=1;i<=n;i++)
{
string s;cin>>s;
for(int i=0;i<26;i++)
for(int j=0;j<26;j++)
{
string cur;
cur+=char(i+'a');
cur+=char(j+'a');
if((i==s[0]-'a'&&j!=s[1]-'a')||(i!=s[0]-'a'&&j==s[1]-'a'))ans+=g[i][j];
}
g[s[0]-'a'][s[1]-'a']++;
}
cout<<ans<<endl;
return ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}
思路:枚举A的可能情况,在前缀上二分出B即可
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
ll pre[N];
void solve()
{
int ans=0;
int n;cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i],pre[i]=pre[i-1]+a[i];
for(int i=1;i<n;i++)
{
ll A=pre[i];
if(pre[n]-pre[i]<A)continue;
else
{
int l=i+1,r=n;
while(l<r)
{
int mid=l+r+1>>1;
// if(i==1)cout<<l<<' '<<r<<' '<<mid<<endl;
if(pre[n]-pre[mid-1]>=A)l=mid;
else r=mid-1;
}
if(pre[n]-pre[r-1]==A)ans=max(ans,n-r+1+i);
}
}
cout<<ans<<endl;
return ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}
思路:按列模拟下下坠即可.
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
char g[60][60];
void solve()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>g[i][j];
/* for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)cout<<g[i][j]<<' ';
cout<<endl;
}
cout<<endl;*/
for(int j=1;j<=m;j++)
{
int l=1,r;
while(g[l][j]=='o'&&l<=n)l++;//找到起点
r=l;
while(l<n)
{
int cnt=0;
while(g[r][j]!='o'&&r<=n)
{
if(g[r][j]=='*')cnt++;
r++;
}
for(int i=r-1;i>=r-cnt;i--)g[i][j]='*';
for(int i=r-cnt-1;i>=l;i--)g[i][j]='.';
while(g[r][j]=='o'&&r<=n)r++;
l=r;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)cout<<g[i][j];
cout<<endl;
}
cout<<endl;
return ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}
思路:
考虑从高位往低位构造答案.因为最后求的是AND运算,假如某一个二进制位对ans有贡献必须保证每一个ai都在该位上是1.且应该贪心的构造尽可能先满足高位变成1的情况.
AC Code:
#include<bits/stdc++.h>
#pragma optimize(2)
#define endl '\n'
#define ll() to_ullong()
#define string() to_string()
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int M=2010;
const int P=13331;
const ll llinf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=2e6+10;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
int cnt[31];
void solve()
{
int n,k;
cin>>n>>k;
memset(cnt,0,sizeof cnt);
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=30;j++)
if((a[i]>>j)&1)cnt[j]++;
ll ans=0;
for(int i=30;i>=0;i--)
{
if(cnt[i]!=n&&k>=n-cnt[i])k-=n-cnt[i],ans+=(1<<i);
else if(cnt[i]==n)ans+=(1<<i);
}
cout<<ans<<endl;
return ;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)solve();
return 0;
}