Codeforces
A. Spy Detected!
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;
int dp[N];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>dp[i];
int pos;
for(int i=1;i<=n;i++){
if(i==1){
if(dp[1]!=dp[2]&&dp[2]==dp[3]){
pos=1;
break;
}
}
else if(i==n){
if(dp[n]!=dp[n-1]&&dp[n-1]==dp[n-2]){
pos=n;
break;
}
}
else{
if(dp[i]!=dp[i-1]&&dp[i]!=dp[i+1]){
pos=i;
break;
}
}
}
cout<<pos<<endl;
}
return 0;
}
B. Almost Rectangle
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;
char s[444][444];
set<int>rp;
set<int>cp;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
rp.clear();
cp.clear();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>s[i][j];
if(s[i][j]=='*'){
rp.insert(i);
cp.insert(j);
}
}
}
if(rp.size()>1&&cp.size()>1){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(rp.count(i)==1&&cp.count(j)==1) cout<<"*";
else cout<<".";
}
cout<<endl;
}
}
else if(rp.size()==1&&cp.size()>1){
int pos=*rp.begin();
// cout<<pos<<endl;
if(pos!=n) {
for(int j=1;j<=n;j++){
if(cp.count(j)==1){
s[pos+1][j]='*';
}
}
}
else if(pos==n){
for(int j=1;j<=n;j++){
if(cp.count(j)==1){
s[pos-1][j]='*';
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<s[i][j];
}
cout<<endl;
}
}
else if(cp.size()==1&&rp.size()>1){
int pos=*cp.begin();
// cout<<pos<<endl;
if(pos!=n) {
for(int i=1;i<=n;i++){
if(rp.count(i)==1){
s[i][pos+1]='*';
}
}
}
else if(pos==n){
for(int i=1;i<=n;i++){
if(rp.count(i)==1){
s[i][pos-1]='*';
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<s[i][j];
}
cout<<endl;
}
}
}
return 0;
}
C - A-B Palindrome
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;
string s;
int main(){
int t;
cin>>t;
int n,m;
while(t--){
cin>>n>>m;
cin>>s;
int l=0;
int r=n+m-1;
while(l<r){
if(s[l]!=s[r]&&(s[l]=='?'||s[r]=='?')){
if(s[l]=='?') s[l]=s[r];
if(s[r]=='?') s[r]=s[l];
}
l++,r--;
}
int sum0=n;
int sum1=m;
for(int i=0;i<n+m;i++){
if(s[i]=='0') sum0--;
else if(s[i]=='1') sum1--;
}
l=0;
r=n+m-1;
while(l<r){
if(s[l]==s[r]&&s[l]=='?'){
if(sum0>=sum1){
s[l]=s[r]='0';
sum0-=2;
}
else{
s[l]=s[r]='1';
sum1-=2;
}
}
l++,r--;
}
l=0;
r=n+m-1;
bool flag=0;
while(l<r){
if(s[l]!=s[r]){
flag=1;
break;
}
l++,r--;
}
if((n+m)%2){
if(sum0==1) s[(n+m)>>1]='0' ,sum0--;
else if(sum1==1) s[(n+m)>>1]='1' ,sum1--;
}
if(sum0||sum1||flag) cout<<"-1"<<endl;
else cout<<s<<endl;
}
return 0;
}
D - Corrupted Array
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 2e5 + 10;
using namespace std;
string s;
map<ll,int>num;
ll dp[N];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
n+=2;
ll sum=0;
num.clear();
for(auto i=0;i<n;i++){
cin>>dp[i];
sum+=dp[i];
num[dp[i]]++;
}
for(auto i=0;i<n;i++){
sum-=dp[i];
num[dp[i]]--;
if(sum%2==0&&num[sum/2]){
bool flag=0;
for(auto j=0;j<n;j++){
if(i==j) continue;
else if(!flag&&dp[j]==sum/2) flag=1;//,cout<<dp[j]<<"**"<<endl;
else cout<<dp[j]<<" ";
}
cout<<endl;
goto place;
}
sum+=dp[i];
num[dp[i]]++;
}
cout<<"-1"<<endl;
place:;
}
return 0;
}
E - Permutation by Sum
答案
#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 2e5 + 10;
using namespace std;
string s;
map<ll,ll>mp;
ll dp[N];
int main(){
int t;
cin>>t;
while(t--){
mp.clear();
mem(dp,0);
ll n,l,r,pos;
cin>>n>>l>>r>>pos;
ll tot=r-l+1;
ll cnt=1;
for(int i=l;i<=r;i++) dp[i]=cnt++;
ll suml=tot*(tot+1)>>1;
ll sumr=tot*(2*n-tot+1)>>1;
if(pos>=suml&&pos<=sumr){
ll dis=pos-suml;
ll w=dis/tot;
ll res=dis%tot;
for(int i=l;i<=r;i++){
dp[i]+=w;
mp[dp[i]]++;
}
if(res){
for(int i=l;i<=r;i++){
if(!mp[dp[i]+res]&&dp[i]+res<=n){
mp[dp[i]]=0;
dp[i]+=res;
mp[dp[i]]++;
break;
}
}
}
cnt=0;
for(int i=1;i<=n&&cnt<l-1;i++){
if(!mp[i]){
cnt++;
cout<<i<<" ";
mp[i]++;
}
}
for(int i=l;i<=r;i++) cout<<dp[i]<<" ";
for(int i=1;i<=n;i++){
if(!mp[i])
cout<<i<<" ";
}
cout<<endl;
}
else puts("-1");
}
return 0;
}
F - Education
答案
#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 2e5 + 10;
using namespace std;
ll dp[N];
ll mp[N];
ll dp1[N];
ll dp2[N];
void solve(){
int t;
cin>>t;
while(t--){
ll n,c;
cin>>n>>c;
for(int i=0;i<n;i++) cin>>dp[i];
for(int i=0;i<n-1;i++) cin>>mp[i];
dp1[0]=dp2[0]=0;
ll minn=INF;
for(int i=0;i<n;i++){
minn=min(minn,dp1[i]+max((c-dp2[i]+dp[i]-1)/dp[i],0ll));
if(i==n-1) break;
ll res=max((mp[i]-dp2[i]+dp[i]-1)/dp[i],0ll);
dp1[i+1]=dp1[i]+res+1;
dp2[i+1]=dp2[i]+res*dp[i]-mp[i];
}
cout<<minn<<endl;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}