A - Wrong Answer
如果a+b等于1那么输出0,否则输出1
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int a,b;
cin>>a>>b;
cout<<(a+b==1?0:1)<<'\n';
return 0;
}
B - Adjacency Matrix
对于每一行,如果第 j 列为 1 那么输出 j
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
int x;
cin>>x;
if(x) cout<<j<<' ';
}
cout<<'\n';
}
return 0;
}
C - 343
当到达上限 1e18 时,开根号3的值最多在 50万左右,完全可以从 1 开始遍历,看每个数是否符合条件,找出符合条件的最大数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool check(ll x)
{
vector<int> num;
while(x) num.push_back(x%10), x/=10;
int l=0,r=num.size()-1;
while(l<=r) {
if(num[l++]!=num[r--]) return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
ll n,ans=1,idx=1,res=pow(idx,3);
cin>>n;
while(res<=n) {
if(check(res)) ans=max(ans,res);
res=pow(++idx,3);
}
cout<<ans<<'\n';
return 0;
}
D - Diversity of Scores
可以用 map 存在每个数的个数,当个数从0变为1时,那么不同的数加一,当个数从1变为0时,那么不同的数减一
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n,t;
cin>>n>>t;
ll diff=1;
vector<ll> v(n+1);
map<ll,int> mp;
mp[0]=n;
while(t--) {
ll idx,value;
cin>>idx>>value;
mp[v[idx]]--;
if(mp[v[idx]]==0) diff--;
ll newvalue=value+v[idx];
if(mp[newvalue]==0) diff++;
mp[newvalue]++,v[idx]=newvalue;
cout<<diff<<'\n';
}
return 0;
}
F - Second Largest Query
可以用线段树维护一段区间中最大值、最小值以及它们的个数。
对于线段树中的一个点来说,如果它的左右子树最大值相同,那么根节点的最大值的个数等于子节点的最大值的个数之和,否则分别找出最大值和次大值,并分别维护他们的数量。
对于一个节点来说,它的最大值等于子节点各自的最大值的最大值,次大值等于子节点最大值的次大值与子节点次大值的最大值的最大值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
struct node{
ll l,r,mx1,mx2,cnt1,cnt2;
}tr[200010*4];
ll arr[200010];
node pushup(node a,node b)
{
node res={0,0,0,0,0,0};
res.l=a.l,res.r=b.r;
if(a.mx1==b.mx1) {
res.mx1=a.mx1;
res.cnt1=a.cnt1+b.cnt1;
res.mx2=max(a.mx2,b.mx2);
res.cnt2=0;
if(res.mx2==a.mx2) res.cnt2+=a.cnt2;
if(res.mx2==b.mx2) res.cnt2+=b.cnt2;
} else {
res.mx1=max(a.mx1,b.mx1);
if(res.mx1==a.mx1) res.cnt1=a.cnt1;
else res.cnt1=b.cnt1;
res.cnt2=0;
res.mx2=max(min(a.mx1,b.mx1),max(a.mx2,b.mx2));
if(res.mx2==a.mx1) res.cnt2+=a.cnt1;
if(res.mx2==a.mx2) res.cnt2+=a.cnt2;
if(res.mx2==b.mx1) res.cnt2+=b.cnt1;
if(res.mx2==b.mx2) res.cnt2+=b.cnt2;
}
return res;
}
void pushup(int u)
{
tr[u]=pushup(tr[u<<1],tr[u<<1|1]);
}
void build(int u,int l,int r)
{
tr[u].l=l,tr[u].r=r;
if(l==r) {
tr[u].mx2=0,tr[u].mx1=arr[r],tr[u].cnt1=1;
} else {
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
node query(int u,int l,int r) // 最大值,最小值
{
if(tr[u].l>=l&&tr[u].r<=r) {
return tr[u];
} else {
int mid=tr[u].l+tr[u].r>>1;
node left={0,0,0,0,0,0},right={0,0,0,0,0,0};
if(l<=mid) left=query(u<<1,l,r);
if(r>mid) right=query(u<<1|1,l,r);
return pushup(left,right);
}
}
void modify(int u,int idx,int x)
{
if(tr[u].l==tr[u].r&&tr[u].l==idx) tr[u].mx1=x;
else {
int mid=tr[u].l+tr[u].r>>1;
if(idx<=mid) modify(u<<1,idx,x);
else modify(u<<1|1,idx,x);
pushup(u);
}
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
ll n,q;
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>arr[i];
build(1,1,n);
while(q--) {
ll op,l,r;
cin>>op>>l>>r;
if(op==1) modify(1,l,r);
else {
node res=query(1,l,r);
cout<<res.cnt2<<'\n';
}
}
return 0;
}
4669


&spm=1001.2101.3001.11974&articleId=136423428&d=1&t=3&u=d2d93bddb3a445a3a325d9a4b6aeb7fd)

被折叠的 条评论
为什么被折叠?



