打edu的比赛确实要轻松多了,但是我真的是死脑筋,C题T了很久,其实不要遍历区间的写法反而短了很多并且一发就过了,但是 我当时一直不愿意去写,真的是。。。
A
判断回文
#include
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=1e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
//head
string s;
bool check(int i,int j)
{
char x,y;
x=s[i]; y=s[j];
if(x+1==y+1||x+1==y-1)return true;
if(x-1==y+1||x-1==y-1)return true;
else return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int flag=1;
cin>>s;
for(int i=0;i2;i++)
{
if(!check(i,n-i-1)){flag=0;break;}
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}
B
找规律
#include
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=1e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
//head
string s;
ll n,q;
ll res;
ll solve(int x,int y)
{
ll t = (x-1)/2;
ll ans = (ll)t*n;
if((x+y)%2) ans +=res;
x = x - t*2;
if(x==1) ans+= (ll)((y-1)/2)+1;
else if(x==2)
{
if(n%2)
{
if(y%2) ans+=(n/2)+(y/2)+1;
else ans+=(n/2)+1+y/2;
}
else ans+=(y-1)/2+1+n/2;
}
return ans;
}
int main()
{
cin>>n>>q;
res = (n*n+1)/2;
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%I64d\n",solve(x,y));
}
return 0;
}
C 数学,求导
#include
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=1e6+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
int a[maxn];
const int maxm=1e4+500;
int cnt[maxn];
int idx=0;
int v[maxm];
int read() {
int x = 0;
char c = getchar();
while (c < '0' || c > '9')c = getchar();
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
idx=0;
int n;
scanf("%d",&n);
int res=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int x,y;
int flag=0;
for(int i=1;i<=n;i++)
{
int k=a[i];
int p=upper_bound(a+1,a+1+n,k)-lower_bound(a+1,a+1+n,k);
if(p>=4)
{
flag=1;
printf("%d %d %d %d\n",k,k,k,k);break;
}
else if(p>=2)
{
v[idx++]=a[i];
}
i+=p-1;
}
if(flag)continue;
sort(v,v+idx);
int len = idx;
int p0=v[0],q0=v[1];
for(int i=0;i1;i++)
{
//cout<" ";
int p =v[i],q=v[i+1];
if(p*q0>q*p0)
{
p0=p;
q0=q;
}
}
printf("%d %d %d %d\n",p0,p0,q0,q0);
}
return 0;
}
D 拓扑排序找环
#include
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=2e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
int in[maxn];
int vis[maxn];
ll a[maxn];
int g[maxn];
int n;
ll ans=0;
vector<int>c;
void check(int y)
{
if(vis[y])return;
ll res =inf;
c.push_back(y);
vis[y]=1;
int tmp = g[y];
res =min(a[tmp],a[y]);
while(!vis[tmp])
{
vis[tmp]=1;
tmp = g[tmp];
res=min(res,a[tmp]);
}
ans+=res;
}
void solve()
{
queue<int>q;
for(int i=1;i<=n;i++)
{
if(!in[i])
{
q.push(i);
}
}
while(!q.empty())
{
int tmp=q.front();
q.pop();
int son =g[tmp];
in[son]--;
if(in[son]==0) q.push(son);
}
}
int main()
{
cin>>n;cl(vis);cl(in);
for(int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
g[i]=x;
in[x]++;
}
solve();
for(int i=1;i<=n;i++)
{
if(in[i])check(i);
}
cout<return 0;
}