未完 暂时只有赛时写出来的A-F的AC代码
还有E的TLE代码 等我今天把题目补完
A
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;}
signed main(){
int t;
cin>>t;
while(t--){
double a,b,c;
cin>>a>>b>>c;
double ans=abs(a-b);
if(ans==0.0){
cout<<0<<endl;
continue;
}
ans/=2;
double count=ans/c;
int use=count;
count+=0.999;
int use1=count;
if(use==use1){
cout<<use<<endl;
}
else cout<<use+1<<endl;
}
return 0;
}
B
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;}
int d,s,n;
signed main(){
int t;
cin>>t;
while(t--){
int far=0x3f3f3f3f;
cin>>n;
for(int i=1;i<=n;i++){
d=read();
s=read();
if(far>d+(s-1)/2){
far=d+(s-1)/2;
}
}
cout<<far<<endl;
}
return 0;
}
C
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t;
cin>>t;
while(t--){
int a,b;
bool f=1;
cin>>a>>b;
if(a==b&&a%2==1){
for(int i=3;i<=sqrt(b);i+=2){
if(a%i==0){
if(a/i==1){
break;
}
cout<<a/i<<' '<<a/i*(i-1)<<endl;
f=0;
break;
}
}
if(f==1){
cout<<-1<<endl;
}
continue;
}
for(int i=a;i<=b;i++){
if(i%2==0&&i!=2){
cout<<i/2<<' '<<i/2<<endl;
f=0;
break;
}
}
if(f) cout<<-1<<endl;
}
return 0;
}
D
#include<bits/stdc++.h>
#define int long long
using namespace std;
int gcd(int a, int b) {
return b > 0 ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a / gcd(a, b) * b; // Prevent overflow
}
inline int read() {
int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
signed main() {
int t;
cin >> t;
while (t--) {
int n, x, y;
n = read();
x = read();
y = read();
int use = lcm(x, y);
int a = n / x;
int b = n / y;
int c = n / use;
int num = 0;
num += (n * (n + 1) / 2) - ((n - (a - c)) * (n - (a - c) + 1) / 2);
num -= (b - c) * (b - c + 1) / 2;
cout << num << endl;
}
return 0;
}
E(TLE)
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int a[100005],q;
int prefix[100005];
signed main() {
//freopen("TEST.cpp","w",stdout);
int t;
t=read();
while (t--) {
int n;
n=read();
for(int i=1; i<=n; i++) {
cin>>a[i];
if(i==0) {
prefix[i]=a[i];
} else prefix[i]=prefix[i-1]^a[i];
}
char s[100005];
cin>>(s+1);
q=read();
while(q--){
int b;
b=read();
if(b==1){
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++){
if(s[i]=='0') s[i]='1';
else s[i]='0';
}
}
else{
int g;
cin>>g;
int result=0;
for(int i=1;i<=n;i++){
if(s[i]-'0'==g){
if(i==0){
result^=prefix[1];
}
else result^=prefix[i]^prefix[i-1];
}
}
cout<<result<<' ';
}
}
cout<<endl;
}
return 0;
}
E (AC)
这个还是讲一下吧,比赛的时候写了一个暴力+前缀和的代码,想着div3就没有计算时间复杂度…结果TLE了然后最后15分钟疯狂的搞线段树也没搞出来/(ㄒoㄒ)/~~赛后发现别人的写法根本没用到线段树…
正解
查询:
题目每次查询所有s[i]为0或s[i]为1的a[i]异或和可以直接存储
修改:
因为XOR相同为0不同为1 所以很显然两个十进制的数相互XOR的结果为0 那么就可以介入前缀和啦 使用xorSum表示a[i]前缀异或和当a[l~r]需要修改的时候,我们只需要把a[i]在l-r区间上的变化量求出来,因为xorSum[r]^xorSum[l-1] 等于区间l到r翻转后的a值所以再异或存储的就行(估计讲的不太好 建议多看看代码,自己模拟模拟)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100005],xorSum[100005];
signed main() {
int t;
cin>>t;
while(t--){
memset(xorSum,0,sizeof(xorSum));
int n;
cin>>n;
int xorzero=0;
int xorone=0;
for(int i=0;i<n;i++){
cin>>a[i];
xorSum[i+1]=xorSum[i]^a[i];
}
string s;
cin>>s;
for(int i=0;i<n;i++){
if(s[i]=='0') {
xorzero^=a[i];
}
else {
xorone^=a[i];
}
}
int q;
cin>>q;
while(q--){
int x;
cin>>x;
if(x==2){
int g;
cin>>g;
if(g==0){
cout<<xorzero<<' '<<endl;
}
else{
cout<<xorone<<' '<<endl;
}
}
else{
int l,r;
cin>>l>>r;
int xorSumLR=xorSum[r]^xorSum[l-1];
xorone^=xorSumLR;
xorzero^=xorSumLR;
}
}
}
return 0;
}
F
#include<bits/stdc++.h>
#define int long long
using namespace std;
int mod=1000000007;
int idx=0;
int mini=0x3f3f3f3f;
void dfs(int i,int adj[],bool vis[],int c[],vector<int>&order){
vis[i]=1;
int par=adj[i];
order.push_back(i);
if(c[i]<=mini){
mini=c[i];
idx=i;
}
if(vis[par]==0){
dfs(par,adj,vis,c,order);
}
}
int par[100005],c[100005],inedges[100005];
bool vis[100005];
signed main(){
int t=1;
cin>>t;
while(t--){
memset(vis,0,sizeof(vis));
memset(inedges,0,sizeof(inedges));
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>par[i];
inedges[par[i]]++;
}
for(int i=1;i<=n;i++){
cin>>c[i];
}
queue<int>q;
vector<int> ans;
for(int i=1;i<=n;i++){
if(inedges[i]==0){
q.push(i);
}
}
while(!q.empty()){
int curr=q.front();
vis[curr]=1;
inedges[par[curr]]--;
ans.push_back(curr);
q.pop();
if(inedges[par[curr]]==0){
q.push(par[curr]);
}
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
idx=-1;
vector<int> order;
mini=0x3f3f3f3f;
dfs(i,par,vis,c,order);
int id= 1;
for(int j=0;j<order.size();j++){
if(order[j]==idx){
id=j;
break;
}
}
for(int j=id+1;j<order.size();j++){
ans.push_back(order[j]);
}
for(int j = 0; j < id; j++) {
ans.push_back(order[j]);
}
ans.push_back(idx);
}
}
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<' ';
}
cout<<endl;
}
return 0;
}
还有,如果想在比赛的时候要代码,可以私信我,如果人数足够了,我就再开一个账号,专门在比赛时候给大家免费发代码 关注我就行 谢谢啦O(∩_∩)O
喜欢的点个攒吧,谢谢了 今天6点前把所有题都补上