首页 > 其他分享 >test 2024.8.19

test 2024.8.19

时间:2024-08-19 14:41:31浏览次数:14  
标签:cnt 19 2024.8 int add test inf hd dis

test

考试时

PUCK:我们攻克了一个技术问题,现在可以用 c++14 了

结果:评测机发神经吃我100分

T1

T2

T3

T4

没错就是这道吃了我100pts

一眼可以发现是一个很典的最大费用最大流模型,暴力建图

发现边数 \(n^2\) 不可过

注意到曼哈顿距离是两个绝对值构成的

注意到 \(|a|+|b|=\max(a+b,-a+b,a-b,-a-b)\)

于是在男女间设立四个虚拟点代表四种情况就可以了

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3005;
const int M=6e6+5;
const int inf= LONG_LONG_MAX;
int n,m,s,t;
struct edge{
     int v,nxt,w,x;
}e[M];
int cnt=1,hd[M];
void add(int u,int v,int w,int X){//建边、
    e[++cnt]={v,hd[u],w,X},hd[u]=cnt;
    e[++cnt]={u,hd[v],0,-X},hd[v]=cnt;
}
int F;
int ans;
int pre[M];
bool vis[M];
int dis[M];
int dt[M];
int upd(int x){int ret=dt[t];
    while(x!=s){
        if(x==s) break;
        e[pre[x]].w-=ret,e[pre[x]^1].w+=ret;
        x=e[pre[x]^1].v;
    }
    return ret; 
}
void EK(){
    while(1){
        for(int i=s;i<=t;i++) vis[i]=0,dis[i]=-inf,dt[i]=inf;
        queue<int> Q;
        Q.push(s);vis[s]=1;dis[s]=0;
        while(!Q.empty()){
            int x=Q.front();vis[x]=0;
            Q.pop();
            for(int i=hd[x];i;i=e[i].nxt){
                if(e[i].x+dis[x]>dis[e[i].v] and e[i].w){
                    pre[e[i].v]=i;dt[e[i].v]=min(dt[x],e[i].w);
                    dis[e[i].v]=e[i].x+dis[x];
                    if(!vis[e[i].v]) Q.push(e[i].v),vis[e[i].v]=1;
                }
            }
        }
        if(dis[t]==-inf) break;//cerr<<"?";
        int nf=upd(t);
        ans+=nf,F+=nf*dis[t];
    }
}/
int x[N],y[N],c[N];
int t1,t2,t3,t4;
signed main(){ 
    // freopen("offsheet.in","r",stdin);
    // freopen("offsheet.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;s=0,t=2*n+5;
    t1=2*n+1,t2=t1+1,t3=t2+1,t4=t3+1; 
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i]>>c[i];
        add(s,i,c[i],0);
        add(i,t1,inf,x[i]+y[i]);
        add(i,t2,inf,x[i]-y[i]);
        add(i,t3,inf,-x[i]+y[i]);
        add(i,t4,inf,-x[i]-y[i]);
    }
    for(int i=1;i<=n;i++){
        int k=i+n;
        cin>>x[k]>>y[k]>>c[k];
        add(k,t,c[k],0);
        add(t1,k,inf,-x[k]-y[k]);
        add(t2,k,inf,-x[k]+y[k]);
        add(t3,k,inf,x[k]-y[k]);
        add(t4,k,inf,+x[k]+y[k]);
    }
    EK();
    cout<<F;
}

标签:cnt,19,2024.8,int,add,test,inf,hd,dis
From: https://www.cnblogs.com/exut/p/18367247

相关文章

  • 【Windows Server2016下Oracle19c DG配置实操步骤】
    WindowsServer2016下Oracle19cDG配置实操步骤文章目录WindowsServer2016下Oracle19cDG配置实操步骤前言一、部署规划1.1、虚拟机搭建:1.2、环境规划:1.3、主库操作系统配置1.4、安装Oracle数据库。1.5、克隆虚拟机二、主库配置2.1、查看主库归档和附加日志配置2.3、......
  • AtCoder Beginner Contest 367
    题目链接:AtCoderBeginnerContest367总结:发挥很一般,A一直wa。开场有点事,导致D也没debug出来。A.ShoutEverydaytag:模拟Solution:注意\(B>C\)与\(B<C\)的不同情况即可。voidsolve(){  inta,b,c;  cin>>a>>b>>c;  if(c>b){    if(......
  • 题解:AT_iroha2019_day1_f Head of The Dragon
    题目大意得知\(n\)和\(k\),求出\(n\)是否能分解出\(k\)个因数相乘,输出按字典序最小一种情况。步骤将\(n\)分解质因数。判断质因数个数是大于\(k\),否则输出\(-1\)。按照分解出来的质因数从小到大输出。代码#include<bits/stdc++.h>#defineintlonglongus......
  • 洛谷 P3919 可持久化线段树 1 之主席树模板(初级)
    洛谷P3919题解传送锚点摸鱼环节【模板】可持久化线段树1(可持久化数组)题目背景UPDATE:最后一个点时间空间已经放大2021.9.18增添一组hack数据by@panyf标题即题意有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集)题目描述如题,你需要维护这......
  • 2024.8.18
    DATE#:20240818ITEM#:DOCWEEK#:SUNDAYDAIL#:捌月拾伍TAGS <BGM="pureimagination--Rook1e"><theme=oi-contest><[NULL]><[空]><[空]>```前天是小兔子,昨天是小鹿,今天是你。--Clannad```T1玩具时间限制:1s 内存限制:5......
  • 洛谷P1020 [NOIP1999 提高组] 导弹拦截(未完)
    传送门:P1020[NOIP1999提高组]导弹拦截题目大意:一个拦截导弹的系统,每次只能拦截高度不超过上一个的导弹求出:一个系统最多能拦截的导弹数量;要拦截所有导弹最少需要的该系统的数量。思路:第一问:一眼就是最长单调不上升子序列,朴素DP求解,复杂度为O(n^2);请参考,能过掉50%......
  • 洛谷P1983 [NOIP2013 普及组] 车站分级 题解
    思路由题可知,在一趟车次的区间内,停靠的站点的等级恒大于不停靠的站点。因此,对于每一趟车次的区间,给所有停靠的站点向所有不停靠的站点两两连有向边,然后求图中最长的路径长度,就能得到答案。实现因为可能出现重边,而且\(n\le1000\),所以在处理车次连边的时候使用邻接矩阵,再改成邻......
  • 2024.8.18 鲜花
    鱼,好大的鱼,虎纹鲨鱼回リ続ける歯车には成リ下がらない平均演じる诞生から始まった地狱游び半分で神が导いた盤上の世界NONONOGAMENOLIFEぬるい平穏をばっさリ切リ舍てて栄光への阶段に存在刻むんだ目に映るのは完全胜利の运命何もかも计算どおり変えて......
  • 2024.8.18 周总结(上周天到这周六集训,这周天放假)
    感觉这一周上难度了,尤其没听懂的是二分图和博弈论那天上午休息完之后的部分。有复习,有新知识,收获还是比较大的。晚上打游戏打多了。文化课没学多少。中午看番、玩寝室楼下桌上的游戏去了,因为寝室要关灯拉窗帘睡得也更早,一周就只写了一点点字帖,看了一点点《乡土中国》。综......
  • 学习笔记 韩顺平 零基础30天学会Java(2024.8.14)
    P500集合体系图     单列集合是指自己只有一个值,双列集合是像键值对这样的P501Collection方法     对于第三点,像Set这样的,存放进去的和取出来的顺序可能不是一样的,所以就叫无序的P502迭代器遍历在调用iterator.next()方法之前必须要调用iterator.ha......