2018.7.3模拟赛

我真的是菜的一笔

T1:

一道贪心大水题,然后我wa了。。。
就是把它按照结束时间排个序,然后乱搞一下就行了

#include <cstdio>
#include <cstdlib>
#include <algorithm>
int n,ans;
struct Node{int t,s,k;} r[100005];
bool cmp(Node x,Node y){if(x.s!=y.s) return x.s<y.s;return x.k<y.k;}
int main(){
//  freopen("manage.in","r",stdin);
//  freopen("manage.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&r[i].t,&r[i].s),r[i].k=r[i].s-r[i].t;
    std::sort(r+1,r+1+n,cmp);
    ans=0;
    int mn=0x3f3f3f3f;
    for(int i=1;i<=n;i++){
        ans+=r[i].t;
        if(ans>r[i].s) {puts("-1");return 0;}
        mn=std::min(mn,r[i].s-ans);
    }
    if(mn<0) puts("-1");
}
T2

缩点+树形背包,缩完点就和选课一样了。
tarjan写挫,dp写挫。
口胡AC,手写10分GG

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <cstring>
const int N = 105;
using namespace std;
vector<int>G[N];
int n,dfn[N],tim,low[N],stk[N],top,id[N],cnt,v[N],w[N],head[N],ecnt,eecnt,hd[N],m;
bool vis[N];
struct Node {
    int w,v;
} s[N];
struct Edge {
    int to,nxt;
} e[N<<1];
void add(int bg,int ed) {
    e[++ecnt].nxt=head[bg];
    e[ecnt].to=ed;
    head[bg]=ecnt;
}
void tarjan(int x) {
    low[x]=dfn[x]=++tim;
    stk[++top]=x;
    vis[x]=1;
    for(int i=head[x],u; i; i=e[i].nxt) {
        u=e[i].to;
        if(!dfn[u]) {
            tarjan(u);
            low[x]=std::min(low[x],low[u]);
        } else if(vis[u]) low[x]=std::min(low[x],dfn[u]);
    }
    if(dfn[x]==low[x]) {
        int k;
        ++cnt;
        do {
            k=stk[top--];
            vis[k]=0;
            id[k]=cnt;
            s[cnt].v+=v[k],s[cnt].w+=w[k];
        } while(k!=x);
    }
}
int f[N][N*5],ru[N];
void dp(int x){
    if(s[x].w>m)return;
    memset(f[x],0xcf,sizeof f[x]);
    for(int i=s[x].w;i<=m;i++) f[x][i]=s[x].v;
    for(int i=0;i<G[x].size();i++) {
        dp(G[x][i]);
        for(int j=m;j>=s[x].w;j--) {
            for(int k=j;k>=0;k--) {
                f[x][j]=max(f[x][j-k]+f[G[x][i]][k],f[x][j]);
            }
        }
    }
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1,x; i<=n; i++)
        scanf("%d",&w[i]);
    for(int i=1,x; i<=n; i++)
        scanf("%d",&v[i]);
    for(int i=1,x; i<=n; i++)
    {   scanf("%d",&x);if(x)add(x,i);}
    for(int i=1; i<=n; i++) if(!dfn[i]) tarjan(i);
    for(int i=1;i<=n;i++) {
        for(int j=head[i];j;j=e[j].nxt) {
            int v=e[j].to;
            if(id[v]!=id[i]){
                G[id[i]].push_back(id[v]);
                ru[id[v]]++;
            }
        }
    }
    for(int i=1;i<=cnt;i++)
    if(!ru[i]){
        dp(i);
        for(int j=m;j>=0;j--){
            for(int k=j;k>=0;k--){
                f[0][j]=max(f[0][j],f[i][k]+f[0][j-k]);
            }
        }
    }
    printf("%d",f[0][m]);
}
T3

一道线段树的操作题。也可以分块ryc分块写挫
线段树维护最长连续上升子序列裸题,写挂交暴力。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using std::max;
const int N=1e6;
struct Seg{
    int l,r,len;double mx;
}t[N<<2];

void build(int l,int r,int cur){
    t[cur].l=l;t[cur].r=r;
    if(l==r){return;}
    int mid=(l+r)>>1;
    build(l,mid,cur<<1);
    build(mid+1,r,cur<<1|1);
}
int query(int cur,double hig) {
    if(t[cur].l==t[cur].r)return t[cur].mx>hig;
    if(t[cur<<1].mx>=hig) return t[cur].len-t[cur<<1].len+query(cur<<1,hig);
    else return query(cur<<1|1,hig);
}
void update(int cur,double hig,int now){
    if(t[cur].l==t[cur].r) {t[cur].mx=hig,t[cur].len=1;return;}
    int mid=(t[cur].l+t[cur].r)>>1;
    if(mid>=now) update(cur<<1,hig,now);
    else update(cur<<1|1,hig,now);
    t[cur].mx=max(t[cur<<1].mx,t[cur<<1|1].mx);
    t[cur].len=t[cur<<1].len+query(cur<<1|1,t[cur<<1].mx);
}
int main(){
    int n,m,x,y;
    scanf("%d%d%",&n,&m);
    build(1,n,1);
    while(m--){
        scanf("%d%d",&x,&y);
        update(1,(double)y/(double)x,x);
        printf("%d\n",t[1].len);
    }
}

总结:我太菜了,GhostCai不可能把我按在键盘上 !a~ 阿QASA发挥得犯的话题

重来:我太菜了,平时写题细节上挂了就看题解,导致代码查错很菜啊,还有树上的东西好像一直掌握的不太扎实网络流大法好!

原文地址:https://www.cnblogs.com/sdfzhsz/p/9259730.html

时间: 2024-08-30 15:20:37

2018.7.3模拟赛的相关文章

2018/5/24模拟赛总结

shzr带病AK虐爆全场... T1n皇后: 这题没啥好说的... T2有重复元素的排列问题: [问题描述] 设R={ r1, r2 , -, rn}是要进行排列的n个元素.其中元素r1, r2 , -, rn可能相同.试设计一个算法,列出R的所有不同排列. [编程任务] 给定n 以及待排列的n 个元素.计算出这n 个元素的所有不同排列. [输入格式] 由perm.in输入数据.文件的第1 行是元素个数n,1≤n≤500.接下来的1 行是待排列的n个元素. [输出格式] 计算出的n个元素的所有不

2018/02/26 模拟赛

第一题排序暴力 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #include<utility> 8 #include<stdio.h> 9 #include<cstdlib> 10 #include<

2018/3/19 模拟赛 35分

T1 不会计算几何弃疗了. T2 写了个bitset结果还不如不优化(手动滑稽),因为测样例开小了空间忘了开回去所以0分. 正解是FFT,不会FFT.. T3 暴力35分,正解倍增floyd,学长还讲过但是还是错了,又多了一个要学的知识点. 原文地址:https://www.cnblogs.com/137shoebills/p/8602386.html

2018.11.1模拟赛总结

贪心 + 堆 因为可以不选满,所以可以把小于 \(0\) 的值赋值为 \(0\), 先考虑按 \(a_i\) 从大到小排序, 然后考虑选择 \([A + 1 \dots n]\) 中最大的 \(b_i\).但是这样不一定会成为最优解,我们从 \(A + 1\) 开始向 \(A + B\) 扫描,每一次尝试放弃前面的一个 \(a_i\) , 然后用当前的物品更新 \(a_i\) 的答案.前者可以通过用一个包含了第 \(A\) 个物品的 \(b_i - a_i\) 的 \(set\) 维护,后者可以

树的dfs序,p1539,其他经典问题,2018/11/08模拟赛T3

树的dfs序指从根节点进行dfs(先序遍历),每次到达某个点的时间和离开这个点的时间.它可以将树上的问题转换成序列问题进行处理. 比如对于p1539的样例可以这样解释. 每个点的左边数字表示进入该点的"时间",右边的数字表示离开该点的"时间".对dfs序的介绍就到这里. 然后来看一个例题: 先读入边,跑一遍dfs确定dfs序. 对于操作1,把点x的进入的"时间"+=a,把x出去的"时间"-=a 这样操作3询问根节点到y的路径点

2018 蓝桥杯省赛 B 组模拟赛(一)

2018 蓝桥杯省赛 B 组模拟赛(一) A.今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”. 花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”. 请你计算:蒜头君和花椰妹年龄一共有多少种可能情况? 提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内. 题解: 暴力枚举 answer: 1 代码如下: #

【2018.11.22】ctsc2018(模拟赛!)

太蠢了……$noip$ 后第一次模拟赛竟然是这样的……完全就是打击自信 / 降智…… 1. 假面 一道神仙概率 $dp$!第一次写…… 拿到题就发现血量 $m_i$ 的上限只有 $100$! 然后 $0$ 操作就可以用 $rate(i,j)$ 动态维护第 $i$ 个人血量为 $j$ 的概率啦. $1$ 操作比较麻烦(但是它故意弄得很少). 设 $live_i$ 和 $dead_i$ 分别为 $1$ 操作范围内的第 $i$ 个人活着和死了的概率,$g_{i,j}$ 是除 $i$ 以外有 $j$ 个

2018 ICPC 徐州网络赛

2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution 将环变成链,设\(f[i][0\)~\(2]\),分别表示与第一个数相同,与第一个数不同,与第一个数相同,与第一个数的反相同.然后\(dp\)即可. 时间复杂度:\(O(n)\) B. BE, GE or NE solution 根据题目描述\(dp\)即可. 时间复杂度:\(O(nm)\) C.

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我