选拔赛2
A
https://codeforces.com/gym/105588/problem/M
还是有点难读,相邻两个的和不能重复出现。
打表,奇数偶数分开打表,发现奇数错开一个,偶数照常
#include<iostream>
using namespace std;
#include<cstring>
/*int a[10][10];bool flag=1;
bool vis[100];int n,m;
bool check(){
int vis1[100]={0};
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i+1<=n){
int t1=a[i][j]+a[i+1][j];
if(vis1[t1])return 0;
vis1[t1]=1;
}
if(j+1<=m){
int t2=a[i][j]+a[i][j+1];
if(vis1[t2])return 0;
vis1[t2]=1;
}
}
}
return 1;
}
void dfs(int x,int y){
if(flag)return ;
if(x==n+1&&y==1){
if(check()){
cout<<"get"<<n<<" "<<m<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",a[i][j]);
}printf("\n");
}
flag=1;
}
return ;
}
for(int i=1;i<=n*m;i++){
if(!vis[i]){
vis[i]=1;a[x][y]=i;
if(y!=m)
dfs(x,y+1);
else dfs(x+1,1);
vis[i]=0;
}
}
}
void dabiao(){
for(int i=2;i<=5;i++){
for(int j=3;j<=5;j+=2){
memset(vis,0,sizeof(vis));
n=i;m=j;flag=0;
dfs(1,1);
if(!flag)cout<<"no\n";
}
}
for(int i=2;i<=5;i++){
for(int j=2;j<=5;j+=2){
memset(vis,0,sizeof(vis));
n=i;m=j;flag=0;
dfs(1,1);
if(!flag)cout<<"no\n";
}
}
}
*/
int n,m;
int main(){
//dabiao();
int T;cin>>T;
while(T--){
cin>>n>>m;
printf("YES\n");
int cnt=1;
if(m&1){
for(int i=1;i<=n;i++){
if(i&1){
for(int j=1;j<=m;j++){
printf("%d ",cnt);cnt++;
}
}
else {
int bf=cnt;cnt++;
for(int j=1;j<=m-1;j++){
printf("%d ",cnt);cnt++;
}printf("%d ",bf);
}printf("\n");
}
}else {
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",cnt);cnt++;
}printf("\n");
}
}
}
}
B
https://codeforces.com/gym/104090/problem/D
列转移一圈后的结果,等于开始的结果,
方程秩为n-1,能解出来比例。
#include<iostream>
using namespace std;
int n;double sum=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){double temp;scanf("%lf",&temp);sum+=temp;}
double x=2.0*sum/(1.0*(n+1));double y=x/2.0;
for(int i=1;i<=n;i++){
if(i==1)printf("%.8lf ",x);
else printf("%.8lf ",y);
}
}
C
没过??
D
数据结构2,不用差分的话
https://codeforces.com/gym/104128/problem/D
二分,
转化为判断能否在一次操作后,数组第k大元素>=X
转化为能否在一次操作后,数组>=X的个数>=k
对于某一个元素可以O(1)算出将它变为>=X需要把等差数列首项放在哪里,一个区间[l[i],r[i]]
它对这个区间内有贡献,对[l[i],r[i]]区间权值+1
转化为是否存在一个位置,这个位置权值>=k
#include<iostream>
using namespace std;
#include<cstring>
#define ll long long
const ll N=200010;
ll n,m,k,c,d;
ll b[N];ll a[N];ll na[N];
ll l[N];ll r[N];
bool check(ll mid){
memset(b,0,sizeof(b));
for(ll i=1;i<=n;i++){
if(a[i]>=mid){
l[i]=1;r[i]=n;
b[l[i]]++;b[r[i]+1]--;
}
else {
if(a[i]+c+d*(min(i,m)-1)<mid){
l[i]=-1;r[i]=-1;
}
else {
if(d){
l[i]=max(1ll,i-m+1);r[i]=min(i,(a[i]+c+d*i-mid)/d);//如果c足够大,就算加负多少倍的d也可以正好
//cout<<l[i]<<" "<<r[i]<<endl;
b[l[i]]++;b[r[i]+1]--;
}else {
l[i]=max(1ll,i+1-m);r[i]=i;
b[l[i]]++;b[r[i]+1]--;
}
}
}
}
for(ll i=1;i<=n;i++){
na[i]=na[i-1]+b[i];
if(na[i]>=k)return 1;
}
return 0;
}
int main(){
cin>>n>>k>>m>>c>>d;
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
ll l=0;ll r=1e17;
while(l<r){
// cout<<"check"<<l<<" "<<r<<endl;
ll mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
printf("%lld\n",l);
}
G. Arpa’s overnight party and Mehrdad’s silent entering
二分图:只有偶环
建男女朋友之间边,2i-1和2i之间的边(为什么不能2i 2i+1另一种?)
二分图染色
#include<iostream>
using namespace std;
#include<vector>
const int N=100010;
int px[N];int py[N];
int col[2*N];int n;
vector<int> G[2*N];
void dfs(int u,int fa){
if(col[fa]==1)col[u]=2;
else col[u]=1;
for(auto v:G[u]){
if(!col[v])
dfs(v,u);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d%d",&px[i],&py[i]);
G[px[i]].push_back(py[i]);G[py[i]].push_back(px[i]);
}
for(int i=1;i<=n;i++){
G[2*i].push_back(2*i-1);
G[2*i-1].push_back(2*i);
}
for(int i=1;i<=2*n;i++){
if(!col[i])dfs(i,0);
}
for(int i=1;i<=n;i++){
printf("%d %d\n",col[px[i]],col[py[i]]);
}
}

浙公网安备 33010602011771号