[Apio2012] Guard

Solution

有一些个位置一定是不能存在忍者的。于是我们把这些位置拿走,给所有的数据重标号。
做法:开一个长度为 n n 的数组,对于一定是 0 的一段我们全赋为 1 1 。最终我们把为 1 的扔掉即可。可以用差分 / / 线段树维护。

若重标号后, n=k,那么所有草丛都必须有忍者。特判掉。

而若一个区间 A A 完全包含另一个 B A A 是大的 ),那么我们只保留 B 即可。
做法:把所有区间按 l l 从大到小排序,然后我们对于 i ,记录 mini1j=1r[i] min j = 1 i − 1 r [ i ] ,若这个值小于 r[i] r [ i ] ,那区间 i i 必定完全包含某个区间,删掉。
原因:在 i 前面的区间 j j ,均有 l[i]l[j] ,而存在 r[j]r[i] r [ j ] ≤ r [ i ] ,则它一定要被删。

我们单独考虑,如果要放最少的忍者而满足所有条件怎么做?

把所有区间按右端点排序。枚举每个区间,若这个区间内已经有忍者,那么continue;否则在右端点处放置一个忍者。(对后面贡献一定最大)

考虑什么时候一个点必须放忍者。即,我们在这个区间的 r1 r − 1 的位置放一个,使得总忍者数依然不超过 k k

于是定义 f[i] :满足 [1,i] [ 1 , i ] 至少放置的忍者数。(正推,贪心的放在右端点)
同样地有 g[i] g [ i ] :满足 [i,n] [ i , n ] 至少放置的忍者数。(逆推,贪心的放在左端点)

对于一个区间的 r1 r − 1 ,我们找出它能满足的一段区间,设为 [ql,qr] [ q l , q r ]
由于在我们去掉包含关系后,所有的区间均满足左右端点同时严格单调递增。
所以我们可以二分出 ql q l qr q r
那么需要的忍者数为: f[ql1]+f[qr+1]+1 f [ q l − 1 ] + f [ q r + 1 ] + 1
若这个数大于 k k ,那么 i 一定必须,否则一定不必须。

Code

#include <bits/stdc++.h>
using namespace std;
#define N 100010
struct item {int x, y, c;}a[N], d[N];
bool cmp1(item A, item B) {return A.c > B.c;}
bool cmp2(item A, item B) {return A.x == B.x ? A.y < B.y : A.x > B.x;}
bool cmp3(item A, item B) {return A.y < B.y;}
int n, k, m, b[N], mn[N], mx[N], f[N], g[N], isr[N], rl[N];
multiset<int> S;
int main() {
    scanf("%d%d%d", &n, &k, &m);
    memset(b, 0, sizeof(b));
    for(int i = 1; i <= m; ++i) {
        scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].c);
        if(!a[i].c) ++b[a[i].x], --b[a[i].y + 1];
    }
    for(int i = 1; i <= n; ++i) b[i]+= b[i - 1];
    int pre = 0;
    for(int i = 1; i <= n; ++i) {
        if(!b[i]) ++pre, rl[pre] = i;
        mn[i] = pre;
    }
    ++pre;
    for(int i = n; i >= 1; --i) {
        if(!b[i]) --pre;
        mx[i] = pre;
    }
    n = mn[n];
    for(int i = 1; i <= m; ++i) {
        if(!a[i].c) continue;
        a[i].x = mx[a[i].x];
        a[i].y = mn[a[i].y];
        if(a[i].x > a[i].y || a[i].x > n || a[i].x <= 0 || a[i].y <= 0 || a[i].y > n) a[i].c = 0;
    }
    if(n == k) {
        for(int i = 1; i <= n; ++i) printf("%d\n", rl[i]);
        return 0;
    }
    sort(a+1, a+m+1, cmp1);
    for(int i = 1; i <= m; ++i) if(!a[i].c) {m = i - 1; break;}
    memcpy(d, a, sizeof(d));
    sort(d+1, d+m+1, cmp2);
    for(int i = 1; i <= m; ++i) {
        if(S.begin() != S.end() && (*S.begin()) <= d[i].y) d[i].c = 0;
        else S.insert(d[i].y), d[i].c = 1;
    }
    memcpy(a, d, sizeof(a));
    sort(a+1, a+m+1, cmp1);
    for(int i = 1; i <= m; ++i) if(!a[i].c) {m = i - 1; break;}
    sort(a+1, a+m+1, cmp3);
    pre = 0; f[0] = 0;
    for(int i = 1; i <= m; ++i) {
        f[i] = f[i - 1]; isr[i] = 0;
        if(!(a[i].x <= pre && pre <= a[i].y)) ++f[i], pre = a[i].y, isr[i] = 1;
    }
    pre = n + 1; g[m + 1] = 0;
    for(int i = m; i >= 1; --i) {
        g[i] = g[i + 1];
        if(!(a[i].x <= pre && pre <= a[i].y)) ++g[i], pre = a[i].x;
    }
    bool prt = 0;
    for(int i = 1; i <= m; ++i) {
        if(!isr[i]) continue;
        if(a[i].x == a[i].y) {printf("%d\n", rl[a[i].y]); prt = 1; continue;}
        int l = 1, r = i - 1, ql = 0, qr = m + 1;
        while(l <= r) {
            int mid = (l + r)>>1;
            if(a[mid].y < a[i].y - 1) ql = mid, l = mid + 1;
            else r = mid - 1;
        }
        l = i + 1, r = m;
        while(l <= r) {
            int mid = (l + r)>>1;
            if(a[i].y - 1 < a[mid].x) qr = mid, r = mid - 1;
            else l = mid + 1;
        }
        if(f[ql] + g[qr] + 1 > k) printf("%d\n", rl[a[i].y]), prt = 1;
    }
    if(!prt) puts("-1");
    return 0;
}
IP-Guard V3 暴力破解版 软件就不多介绍了,相信很多人在找但是都没有找到破解版,有些人虽然手里有,但要卖人民币,刚好自己也在学习破解,就拿了这个软件做为学习对象,因个人能力有限,破解技术有待提高,没有办法找出注册码,只找到了序列号,现在只放出暴力破解版,等破解技术提高了,有能力找出注册算法,再做注册机。 软件使用: 1、首先安装SQL 2000或以上专业版,注意不要用免费版本; 2、下载本软件最新安装程序,下载链接:http://www.tec-development.com/down/ipguard/V3/IPguard3.11.0720.zip; 3、安装好后,先停止OServer3服务,用补丁文件替换安装目录下的同名文件; 4、启动服务,稍等片刻,再打开软件注册对话框输入序列号; 5、在路由器或防火墙上屏蔽如下IP和网址,虽然破解补丁对软件连网验证部分做了处理,但不排除还有其它验证部分,最好做下屏蔽: IP:58.177.209.130;58.177.209.134;210.51.188.215;218.16.120.134 网址:www.register-center.com;www.ip-guard.com;www.ip-guard.net;www.gzmcrown.com;www.tec-development.com;www.safenet.net.cn;www.myprice.com.cn 6、如果软件偷偷连网验证,导致破解失效,可按如下办法重新注册: 1)停止OServer3服务,方法:右击任务栏的“服务控制器”,选择“停止服务” 2)打开注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{578D04C7-7C7D-448A-AF4A-065606069E85},将“{578D04C7-7C7D-448A-AF4A-065606069E85}”主键删除; 3)打开注册表:HKEY_LOCAL_MACHINE\SOFTWARE\TEC\OCULAR.3\SERVER,将“SERVER”主键删除; 4)打开注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\RNG,将“RNG”主键删除; 5)打开系统盘Windows目录下的win.ini文件,将“[OSERVER3]”及以下内容全部删除,删除前先备份; 6)重新启动OServer3服务,方法:右击任务栏的“服务控制器”,选择“启动服务” 7)重新注册输入相应客户端序列号。 注意:注册表操作不当可能引起系统错误,请谨慎操作,勿删错键值,为防止意外,建议删除前先导出键值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值