A.
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int main(){
int T=read();
while(T--){
int n=read();
int s=n/3,p=n%3;
int h1=s+1,h2=s,h3=s-1;
if(p==0){
cout<<h2<<" "<<h1<<" "<<h3<<endl;
}
else if(p==1){
h1++;
cout<<h2<<" "<<h1<<" "<<h3<<endl;
}
else{
h2+=2;
cout<<h1<<" "<<h2<<" "<<h3<<endl;
}
}
return 0;
}
B.
#include<bits/stdc++.h>
using namespace std;
int a[50005],b[50005];
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int main(){
int T=read();
while(T--){
int n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)b[i]=read();
int mx=1e9+7,ok=1;
for(int i=1;i<=n;i++){
if(a[i]<b[i]){
ok=0;
break;
}
if(b[i]!=0){
mx=min(a[i]-b[i],mx);
}
}
if(ok&&mx<1e9+7){
for(int i=1;i<=n;i++){
if(a[i]-b[i]>mx){
ok=0;
break;
}
if(a[i]-b[i]<mx&&b[i]!=0){
ok=0;
break;
}
}
}
if(ok)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
C.
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int a[200005],b[200005];
signed main(){
int T=read();
while(T--){
int n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)b[i]=read();
for(int i=1;i<=n;i++){
int k=i+1;
while(a[k]<b[i]&&k<=n)a[k]=b[i];
cout<<b[i]-a[i]<<" ";
}
cout<<"\n";
}
return 0;
}
D.
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int sum[200005];
int main(){
int T;
cin>>T;
while(T--){
int n,k;
cin>>n>>k;
int ans=k;
string s;
cin>>s;
sum[0]=0;
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+(s[i-1]=='W');
}
for(int i=k;i<=n;i++){
ans=min(ans,sum[i]-sum[i-k]);
}
cout<<ans<<"\n";
}
return 0;
}
E.
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int a[200005];
signed main(){
int T=read();
while(T--){
int n=read(),k=read(),ans=0;
for(int i=1;i<=n;i++){
a[i]=read();
ans+=a[i]/k;
a[i]%=k;
}
sort(a+1,a+1+n);
int i=1,j=n;
while(i<j){
if(a[i]+a[j]<k)i++;
else {
i++;
j--;
ans++;
}
}
cout<<ans<<"\n";
}
return 0;
}
F.
题意:
给出一个字符串和一个置换群,问按照置换群操作多少次后字符串会回到最初的状态
思路:
考虑把题目中给出的置换群分成多个环,找出每一个环,找出每一个环变回原样的最小步数(res),将当前答案(ans初始为1)更新为ans*res/gcd(ans,res).
可以使用dfs找环并把环中的字符按dfs的顺序生成一个新字符串str,在判断最小步数时可以将该字符串str倍增来str(i,i+len-1)表示操作i次的字符串.
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int a[205];
bool vis[205];
string str,s;
void dfs(int x){
if(vis[x])return;
vis[x]=1;
str+=s[x];
dfs(a[x]);
}
int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
signed main(){
int T;
cin>>T;
while(T--){
int n,ans=1;
cin>>n;
cin>>s;
for(int i=0;i<n;i++)cin>>a[i],a[i]--,vis[i]=0;
vector<int>res;
map<int,int>mp;
for(int x=0;x<n;x++){
if(!vis[x]){
str="";
dfs(x);
int len=str.length();
str+=str;
for(int i=1,j=len;j<str.length();i++,j++){
if(str.substr(i,len)==str.substr(0,len)){
if(!mp[i]){
res.push_back(i);
mp[i]=1;
}
break;
}
}
}
}
for(int i=0;i<res.size();i++){
int g=gcd(ans,res[i]);
ans*=res[i]/g;
}
cout<<ans<<"\n";
}
return 0;
}
G.
题意:
每辆车有一个最高速度,其速度不能超过最高速度也不能超过它前面的车的速度,如此整个序列会被分成值相等的若干段,每次操作会降低某个位置的最高速度,问每次操作完序列的总段数是多少
思路:
每一个序列都是一个不下降序列
可以使用set将每个不下降序列的起点记录下来
set自带排序和去重可以使用upper_bound快速找到每次修改的节点后方的起点,通过prev查找到前方的节点或自己,再分别判断是否可以产生或删除这些起点。
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int a[100005];
signed main(){
int T=read();
while(T--){
set<int>s;
int n=read(),m=read();
int num=0;
for(int i=1;i<=n;i++){
a[i]=read();
if(s.empty()||a[i]<a[*s.rbegin()]){
s.insert(i);
}
}
for(int i=1;i<=m;i++){
int k=read(),d=read();
a[k]-=d;
auto x=s.upper_bound(k);
if(x!=s.begin()){
x=prev(x);
if(a[*x]>a[k]){
s.insert(k);
}
}
else{
s.insert(k);
}
while(1){
auto x=s.upper_bound(k);
if(x!=s.end()&&a[*x]>=a[k]){
s.erase(x);
}
else break;
}
cout<<s.size()<<" ";
}
cout<<"\n";
}
return 0;
}