題目來源:https://codeforces.com/contest/1304
fst真快樂233,好久沒fst了 差點以爲自己有光環
1304A — Two Rabbits
應該不用解釋
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
int f[N];
char str[N];
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
int t;r(t);
while(t--){
r(n); r(m);
int a,b;
r(a); r(b);
int t=(m-n)/(a+b);
if((m-n)%(a+b)==0){
cout<<t<<endl;
}
else cout<<-1<<endl;
}
return 0;
}
1304B — Longest Palindrome
找最多的一對,然後不是一對的就是單個對稱 選一個在中間即可
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
int f[N];
char str[M][M];
bool vis[M];
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
r(n); r(m);
FOR(i,1,n){
scanf("%s",str[i]+1);
//printf("%s",str[i]+1);
}
int cnt=0;
vector<int> ans1,ans2;
FOR(i,1,n){
FOR(j,i+1,n){
if(vis[j]==0){
bool flag=1;
FOR(k,1,m){
if(str[i][k]!=str[j][m-k+1]){
flag=0;
break;
}
}
if(flag){
vis[i]=1; vis[j]=1;
ans1.push_back(i);
ans2.push_back(j);
cnt+=2;
break;
}
}
}
}
int pos=-1;
FOR(i,1,n){
if(vis[i]==0){
bool flag=1;
FOR(j,1,m/2){
if(str[i][j]!=str[i][m-j+1]){
flag=0;
break;
}
}
if(flag){
cnt++;
pos=i;
break;
}
}
}
cout<<cnt*m<<endl;
for(int i=0;i<ans1.size();i++){
int tt=ans1[i];
FOR(j,1,m) cout<<str[tt][j];
}
if(pos!=-1){
FOR(j,1,m) cout<<str[pos][j];
}
for(int i=ans2.size()-1;i>=0;i--){
int tt=ans2[i];
FOR(j,1,m) cout<<str[tt][j];
}
if(cnt!=0) cout<<endl;
return 0;
}
1304C — Air Conditioner
這題fst了 我一口老血噴了出來
就是簡單的求線段並
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
struct node
{
int t,l,r;
}f[M],g[M];
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
int t;
r(t);
while(t--){
r(n); r(m);
FOR(i,1,n){
rrr(f[i].t,f[i].l,f[i].r);
}
bool flag=1;
int cnt=0;
g[++cnt]=f[1];
FOR(i,2,n){
if(f[i].t==f[i-1].t){
int l=max(f[i].l,g[cnt].l);
int r=min(f[i].r,g[cnt].r);
if(l>r){
flag=0;
break;
}
g[cnt].l=l; g[cnt].r=r;
}
else g[++cnt]=f[i];
}
if(flag==0){
cout<<"NO\n";
continue;
}
int l=m,r=m;
FOR(i,1,cnt){
int tt=g[i].t-g[i-1].t;
int ll=l-tt,rr=r+tt;
l=max(g[i].l,ll);
r=min(g[i].r,rr);
if(l>r){
flag=0;
break;
}
}
if(flag==0){
cout<<"NO\n";
}
else{
cout<<"YES\n";
}
}
return 0;
}
1304D — Shortest and Longest LIS
這題就是在滿足大小關係的前提下 對於LIS最短 就是讓右邊的儘量取大 LIS最長就是讓右邊儘量取小嘛。。 但是我不會實現 實現了1h沒搞出來…還以爲是大模擬,結果std那麼短,菜是原罪
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
char str[N];
int ans[N];
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
int t;r(t);
while(t--){
r(n); scanf("%s",str+1);
int num=n,pos=1;
FOR(i,1,n){
if(i==n||str[i]=='>'){
for(int j=i;j>=pos;j--) ans[j]=num--;
pos=i+1;
}
}
FOR(i,1,n) cout<<ans[i]<<' ';
cout<<endl;
num=1,pos=1;
FOR(i,1,n){
if(i==n||str[i]=='<'){
for(int j=i;j>=pos;j--) ans[j]=num++;
pos=i+1;
}
}
FOR(i,1,n) cout<<ans[i]<<' ';
cout<<endl;
}
return 0;
}
1304E — 1-Trees and Queries
倍增求LCA,利用LCA快速求出兩點之間的距離。
對於兩點 如果距離爲d 那就可以走 d+2*k步到達 因爲可以來回走嘛 所以路徑的區別只有奇偶 然後在樹上加一條邊 只會增加2種走法 設路徑爲(x-y) 加的邊爲(a-b) 那路徑就是綠 黃 紫 ,紫和黃奇偶性相同 我們取最短的 然後比較即可~
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e5+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const int bb=18;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
vector<int> v[N];
int dad[N][20];
int dep[N];
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
void build(int x,int fa)
{
dep[x]=dep[fa]+1;
dad[x][0]=fa;
FOR(i,1,bb){
dad[x][i]=dad[dad[x][i-1]][i-1];
}
for(int y:v[x]){
if(y!=fa) build(y,x);
}
}
int getLen(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
int len=0;
for(int i=bb;i>=0;i--){
if(dep[dad[y][i]]>=dep[x]){
y=dad[y][i];
len+=(1<<i);
}
}//dep[x]==dep[y]
if(x==y) return len;
for(int i=bb;i>=0;i--){
if(dad[x][i]!=dad[y][i]){
x=dad[x][i];
y=dad[y][i];
len+=(1<<i+1);
}
}
return len+2;
}
int main()
{
r(n);
FOR(i,1,n-1){
int a,b;
r(a); r(b);
v[a].push_back(b);
v[b].push_back(a);
}
build(1,0);
r(m);
while(m--){
int a,b,x,y,c;
rrr(a,b,x); r(y); r(c);
int t=getLen(x,y);
if(t<=c&&t%2==c%2){
cout<<"YES\n";
continue;
}
int t1=getLen(a,x)+1+getLen(b,y);
int t2=getLen(a,y)+1+getLen(b,x);
t=min(t1,t2);
if(t<=c&&t%2==c%2) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}