C - Distribution
题目链接
思路:3个数组间相互刷新,水题,但是一定要注意一点:
这是一个环!!!!!
所以从头是从2开始处理,然后再从1开始处理一遍
#include <bits/stdc++.h>
#define MAX 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
ll s[maxn], t[maxn];
ll dis[maxn];
int n;
int main(){
cin >> n;
for(int i=1; i<=n; i++) scanf("%lld",&s[i]);
for(int i=1; i<=n; i++) scanf("%lld",&t[i]);
for(int i=2; i<=n; i++){
if(i==2){
dis[2]=t[2];
continue;
}
if(t[i]<dis[i-1]+s[i-1]) dis[i]=t[i];
else dis[i]=dis[i-1]+s[i-1];
}
for(int i=1; i<=n; i++){
if(i==1){
if(t[1]<dis[n]+s[n]) dis[1]=t[1];
else dis[1]=dis[n]+s[n];
continue;
}
if(t[i]<dis[i-1]+s[i-1]) dis[i]=t[i];
else dis[i]=dis[i-1]+s[i-1];
}
for(int i=1; i<=n; i++){
printf("%lld\n",dis[i]);
}
return 0;
}
G - Reorder Cards
题目链接
思路:先找规律,然后发现行和列的处理互不影响,故可以分别处理,那么先将所有的行和列分开进行排序并处理,同时要注意记录输入时的顺序,灵活运用自定义排序即可。
#include <bits/stdc++.h>
#define MAX 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+10;
typedef long long ll;
//注意这里最好用一个struct,因为用2个可能会相同时顺序不一样
struct node{
ll x, y;
ll num;
ll r, c;
}mp[maxn];
ll h, w, n;
ll g, d;
bool cmp1(node a, node b){
return a.x<b.x;
}
bool cmp2(node a, node b){
return a.y<b.y;
}
bool cmp3(node a, node b){
return a.num<b.num;
}
int main(){
cin >> h >> w >> n;
for(int i=1; i<=n; i++){
cin >> g >> d;
mp[i].x=g, mp[i].y=d;
mp[i].num=i;
}
sort(mp+1,mp+n+1,cmp1);
mp[1].r=1;
for(int i=2; i<=n; i++){
if(mp[i].x==mp[i-1].x) mp[i].r=mp[i-1].r; //处理相同情况
else mp[i].r=mp[i-1].r+1;
}
sort(mp+1,mp+n+1,cmp2);
mp[1].c=1;
for(int i=2; i<=n; i++){
if(mp[i].y==mp[i-1].y) mp[i].c=mp[i-1].c;
else mp[i].c=mp[i-1].c+1;
}
sort(mp+1,mp+1+n,cmp3);
for(int i=1; i<=n; i++){
printf("%lld %lld\n",mp[i].r,mp[i].c);
}
return 0;
}
H - Takahashi Tour
题目链接
思路:很明显dfs,用vector存储,先对每个点所连接边的编号进行预处理,让小的排前面,然后注意一下输出位置就好了,进去一个输出,不成功返回输出。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int vis[maxn];
vector <int> v[maxn];
int x, y;
void dfs(int u){
printf("%d ",u);
vis[u]=1;
for(int i=0; i<v[u].size(); i++){
int h=v[u][i];
if(!vis[h]){
dfs(h);
printf("%d ",u);
}
}
}
int main(){
int n;
cin >> n;
for(int i=1; i<n; i++){
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=1; i<=n; i++){
sort(v[i].begin(),v[i].end());
}
dfs(1);
return 0;
}