1. 程式人生 > >CSU 1913: 一條大笨龍送禮物 1914: John and his party 1915: John and his farm 1917: There is no SSR

CSU 1913: 一條大笨龍送禮物 1914: John and his party 1915: John and his farm 1917: There is no SSR

#include <cstdio>
#include <cstring>

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;

const int MAXN = 1e5 + 5;
const int SIZE = 2e5 + 5;

int Sum[MAXN * 3], Col[MAXN * 3];
int a[MAXN];
int n, m, k;
struct o {
    int l, r;
} O[MAXN];

void push_up(int rt) {
    Sum[rt] = Sum[rt << 1] + Sum[rt << 1 | 1];
}

void push_down(int rt, int m) {
    if(Col[rt] != -1) {
        Col[rt << 1] = Col[rt << 1 | 1] = Col[rt];
        Sum[rt << 1] = (m - (m >
> 1)) * Col[rt];
Sum[rt << 1 | 1] = (m >> 1) * Col[rt]; Col[rt] = -1; } } void build(int lowv, int l, int r, int rt) { Col[rt] = -1; Sum[rt] = 0; if(l == r) { Sum[rt] = a[l] > lowv; return; } int mid = (l + r) >> 1; build(lowv, lson); build(lowv, rson); push_up(rt); } void
update(int L, int R, int v, int l, int r, int rt)
{ if(L > R) return; if(L <= l && r <= R) { Sum[rt] = (r - l + 1) * v; Col[rt] = v; return ; } push_down(rt, r - l + 1); int mid = (l + r) >> 1; if(L <= mid) update(L, R, v, lson); if
(R > mid) update(L, R, v, rson); push_up(rt); } int query(int L, int R, int l, int r, int rt) { if(L <= l && r <= R) { return Sum[rt]; } int mid = (l + r) >> 1; push_down(rt, r - l + 1); int ret = 0; if(L <= mid) ret += query(L, R, lson); if(R > mid) ret += query(L, R, rson); return ret; } bool C(int mid, int len) { build(mid, 1, n, 1); for(int i = 0; i < len; i ++) { int s1 = query(O[i].l, O[i].r, 1, n, 1); int s0 = O[i].r - O[i].l + 1 - s1; int cz = (s1 & 1) == 1; int qlk = s1 / 2; update(O[i].l, O[i].l + qlk - 1 + cz, 1, 1, n, 1); update(O[i].l + qlk + cz, O[i].r - qlk, 0, 1, n, 1); update(O[i].r - qlk + 1, O[i].r, 1, 1, n, 1); } return query(k, k, 1, n, 1) == 0; } int main() { while(~scanf("%d%d%d", &n, &m, &k)) { for(int i = 1; i <= n; i ++) { scanf("%d", &a[i]); } int op, len = 0, zl; for(int i = 1; i <= m; i ++) { scanf("%d", &op); if(op == 1) { scanf("%d%d", &O[len].l, &O[len].r); len ++; } else { scanf("%d", &zl); len -= zl; len = len < 0 ? 0 : len; } } //printf("[%d]\n", len); int lb = 0, ub = SIZE; while(ub - lb > 1) { int mid = (ub + lb) >> 1; if(C(mid, len)) ub = mid; else lb = mid; } printf("%d\n", ub); } return 0; }
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<sstream>
#include<vector>
#include<cmath>
#define LL long long
#define md int mid = (L+R)>>1
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
const int maxn = 2e5+50000;
int id[maxn<<2],mx[maxn<<2];
int n;
int ans[maxn];
int lazy[maxn<<2];
void push_up(int rt)
{
    if(mx[ls]>=mx[rs])
        id[rt] = id[ls];
    else
        id[rt] = id[rs];
    mx[rt] = max(mx[ls],mx[rs]);
}
void push_down(int rt)
{
    if(lazy[rt])
    {
        lazy[ls] += lazy[rt];
        lazy[rs] += lazy[rt];
        mx[ls] += lazy[rt];
        mx[rs] += lazy[rt];
        lazy[rt] = 0;
    }
}
void build(int L,int R,int rt)
{
    if(L==R)
    {
        id[rt] = L;
        mx[rt] = -L;
        return ;
    }
    md;
    build(L,mid,ls);
    build(mid+1,R,rs);
    push_up(rt);
}
void update(int l,int r,int L,int R,int rt)
{
   // cout<<"diap"<<endl;
    if(l<=L&&R<=r)
    {
        lazy[rt]++;
        mx[rt]++;
        return ;
    }
    push_down(rt);
    md;
    if(l<=mid)
        update(l,r,L,mid,ls);
    if(r>mid)
        update(l,r,mid+1,R,rs);
    push_up(rt);
}
void change(int p,int L,int R,int rt)
{
    if(L==R)
    {
        mx[rt] = -0x3f3f3f3f;
       // id[rt] = L;
        return ;
    }
    md;
    push_down(rt);
    if(mid>=p)
        change(p,L,mid,ls);
    else
        change(p,mid+1,R,rs);
    push_up(rt);

}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(ans,-1,sizeof(ans));
        build(1,n,1);
        memset(lazy,0,sizeof(lazy));
        for(int i = 0 ;i < n;i++)
        {
            int op,x;
            scanf("%d%d",&op,&x);
            if(!op)
            {
                //cout<<"fuck"<<endl;
                update(1,x,1,n,1);
            //cout<<"gan"<<endl;
            }
            else
                update(x,n,1,n,1);
            if(mx[1]<0)
                continue;
            while(!mx[1])
            {
                ans[id[1]] = i+1;
                change(id[1],1,n,1);
            }
        }
        for(int i = 1;i <= n;i++ )
            printf("%d%c",ans[i],i==n?'\n':' ');
    }
    return 0;
}
#include <queue>
#include <stack>
#include <ctime>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;
typedef long double LB;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef vector<int> VI;

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;

void debug() { cout << endl; }
template<typename T, typename ...R> void debug (T f, R ...r) { cout << "[" << f << "]"; debug (r...); }


const int MAXN = 1e5 + 5;
const int MAXM = 20;

int n, m;
struct Edge {
    int v, next;
} edge[MAXN << 1];
int head[MAXN], tot;
int dep[MAXN], siz[MAXN], fa[MAXN][MAXM];
LL all[MAXN], sum[MAXN];
int root;

void init_edge() {
    tot = 0;
    memset(head, -1, sizeof(head));
}
inline void add_edge(int u, int v) {
    edge[tot] = Edge {v, head[u]};
    head[u] = tot ++;
}
void dfs(int u, int pre, int d) {
    int v;
    siz[u] = 1;
    dep[u] = d;
    sum[u] = 0;
    fa[u][0] = pre;
    for(int i = head[u]; ~i; i = edge[i].next) {
        v = edge[i].v;
        if(v == pre) continue;
        dfs(v, u, d + 1);
        siz[u] += siz[v];
        sum[u] += sum[v];
        sum[u] += siz[v];
    }
}

void dfs2(int u, int pre) {
    int v;
    for(int i = head[u]; ~i; i = edge[i].next) {
        v = edge[i].v;
        if(v == pre) continue;
        all[v] = all[u] + (n - 1 - siz[v]) - (siz[v] - 1);
        dfs2(v, u);
    }
}

void lca_init() {
    for(int j = 1; j < MAXM; ++j) {
        for(int i = 1; i <= n; ++i) {
            fa[i][j] = fa[fa[i][j - 1]][j - 1];
        }
    }
}

int lca(int u, int v) {
    while(dep[u] != dep[v]) {
        if(dep[u] < dep[v]) swap(u, v);
        int d = dep[u] - dep[v];
        for(int i = 0; i < MAXM; i++) {
            if(d >> i & 1) u = fa[u][i];
        }
    }
    if(u == v) return u;
    for(int i = MAXM - 1; i >= 0; i--) {
        if(fa[u][i] != fa[v][i]) {
            u = fa[u][i];
            v = fa[v][i];
        }
    }
    return fa[u][0];
}

int son(int u, int v) {
    while(dep[v] > dep[u] + 1) {
        int w = v;
        for(int j = 0; j < MAXM; ++j) {
            if(dep[fa[v][j]] < dep[u] + 1) break;
            w = fa[v][j];
        }
        v = w;
    }
    return v;
}

int main() {
    int u, v, w;
    while(~scanf("%d %d", &n, &m)) {
        init_edge();
        for(int i = 1; i <= n - 1; ++i) {
            scanf("%d %d", &u, &v);
            add_edge(u, v);
            add_edge(v, u);
        }

        dfs(root = 1, 0, 0);
        all[root] = sum[root];
        dfs2(root, 0);

        lca_init();
        while(m --) {
            scanf("%d %d", &u, &v);
            if(dep[u] > dep[v]) swap(u, v);
            w = lca(u, v);
            int dist, sizu, sizv;
            LL sumu, sumv;
            double ans;
            if(w != u) {
                /** 有lca **/
                dist = dep[u] + dep[v] - 2 * dep[w];
                sizu = siz[u];
                sumu = sum[u];
                sizv = siz[v];
                sumv = sum[v];
            } else {
                /**一條鏈**/
                dist = dep[v] - dep[u];
                w = son(u, v);
                sizu = n - siz[w];
                sumu = all[u] - sum[w] - siz[w];
                sizv = siz[v];
                sumv = sum[v];
            }
            ans = 1.0 + dist + 1.0 * ((LL)sizu * sumv + (LL)sizv * sumu) / ((LL)sizu * sizv);
            printf("%.8f\n", ans);
        }
    }
    return 0;
}
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=105;
struct Matrix{
    int n;
    double m[maxn][maxn];

    void init(int sz){
        n=sz;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                m[i][j]=0;
    }
    Matrix(int sz){init(sz);}
    void set_I(){
        for(int i=0;i<n;i++) m[i][i]=1.0;
    }
    Matrix operator* (const Matrix& a){
        Matrix ans(n);
        for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            ans.m[i][j]+=m[i][k]*a.m[k][j];
        }
        return ans;
    }
};
int main(){
    double p,q;
    int n,m;
    while(scanf("%lf%lf%d%d",&p,&q,&n,&m)!=EOF){
        Matrix base(n),ans(n);
        for(int i=0;i<n;i++) base.m[i][0]=p*pow(q,i);
        for(int i=0;i<n-1;i++) base.m[i][i+1]=1.0;

        ans.m[0][0]=1-pow(q,n);
        for(int i=1;i<n;i++) ans.m[0][i]=1;

        m=m-n;
        while(m){
            if(m&1) ans=ans*base;
            m>>=1;
            base=base*base;
        }
        printf("%.6lf\n",1-ans.m[0][0]);
    }

}

相關推薦

CSU 1913: 禮物 1914: John and his party 1915: John and his farm 1917: There is no SSR

#include <cstdio> #include <cstring> #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 using name

SSM框架報錯分析()——There is no getter for property named 'XXX' in 'class java.lang.String'

一、發現問題 <select id="queryStudentByNum" resultType="student" parameterType="string"> select num,name,phone from student <where> <if t

解決The goal you specified requires a project to execute but there is no POM in this directory錯誤的種方法!

在使用Jenkins自動構建Java專案時,出現以下的錯誤。錯誤日誌如下:  + /opt/maven/apache-maven-3.5.4/bin/mvn clean package -U -e -B -Dmaven.test.skip=true [INFO] Error

binary-tree-maximum-path-sum——二叉樹任意路徑上的最

binary 遞歸 nod 父節點 遍歷 color find start node Given a binary tree, find the maximum path sum. The path may start and end at any node in the

hdu4240 求流量最的路/(此題網上百分之90以上算法是錯誤的)

沒有想到 答案 blog main sin amp init 網上 ans 題意:求最大流/一條流量最大的路的流量。(此題HDU上數據水,以下倆種錯誤的都能過。。。。) 思路1;每次增廣的時候更新流量,保存最大的那條。 錯誤性:每次更新。有可能最大的那條流量是前

曲子:搞人工智能不如養好狗!

人工智能 原計劃更新《相比其它詐騙,區塊鏈ICO到底牛在哪?》,但裏面有很多內容有一些比較深的名詞可能不容易理解,於是我優先更新這篇文章,文中有很多內容與下一篇都有關聯,建立我最近的幾篇內容連起來閱讀,可能會更容易理解。 文章會有很多爭議,看不懂的話可以適當多理解幾次,或者與我互動,若覺得與主流“專家”分享觀

區塊鏈技術開發兩路徑 哪才是商用坦途?

color 通用 均值 經理 交易 訪問 現狀 能力 -a 區塊鏈技術開發被各大媒體貶褒至今,已有些許沈澱。而2018年是區塊鏈的一個應用風口,各大企業、初創者紛紛爆出自己的區塊鏈項目消息,一時間群雄並起引來無數關註。就目前全球的區塊鏈路徑而言只有兩種。一、公有鏈公有鏈是一

安卓Notification 推只顯示問題

轉載請註明出處 http://blog.csdn.net/qq_31715429/article/details/50978587  本文出自:猴菇先生的部落格   (1).推送多條手機全能接收,但是隻顯示一條通知,後一條會頂掉前一條,最後只顯示一條最新的notifica

MySQL刪除重複資料,只保留其中最id的

今天同事寫了個刪除重複資料保留一條記錄的資料庫語句,問我錯在哪兒,正好給大家講講【注:以下語句只單對MYSQL資料庫】 語句 -- 問題: delete from `show` where id not in  (  select MAX(id)

如何學習資料?首先你需要這樣的資料學習路線

最近很多人問我現在學習大資料這麼多,他們都是如何學習的呢。很多初學者在萌生向大資料方向發展的想法之後,不免產生一些疑問,應該怎樣入門?應該學習哪些技術?學習路線又是什麼?今天小編特意為大家整理了一份大資料從入門到精通的學習路線。並且附帶學習資料和視訊。希望能夠幫助到大家。 第一階段:Lin

在mysql 中查詢時間最記錄

首先如下這樣寫是錯的: SELECT name,MAX(last_updated) FROM digital_asset GROUP BY name; 這樣子查到的資料last_updated確實是最大的,但是和name沒有關係; 用這個方法可以實現: SELECT A.* F

面試了名32歲的程式設計師,領導:年紀太,直接走吧

程式設計師是吃青春飯的行業嗎?這個問題放在國內,很多人都會表示認同,君不見,很多網際網路企業招聘程式設計師,年紀三十多歲的一般就不考慮了,比如華為,前段時間就盛傳清退35歲以上的員工,雖然沒有得到官方證實,但空穴不來風。華為好歹設了一個35歲的標準,可是近日一名網友的爆料卻讓

【綜述篇】鵝廠劇拉開帷幕,“河”、“兩張網”……等等!還有啥?

我是一條河 流經時間與空間 連線永珍與未來 …… 走進猶如梵高畫作般的劇院,開場一部官宣主題片《河流》將騰訊二十年始終未變的“連線力”以及“行萬里、利萬物”的理念展現給世人,這就是此時此刻正在上演的鵝廠大劇——2018騰訊合作伙伴大會! 在南京,我們是觀眾;未來

【DP】在矩陣中,選擇從左上角到右下角、經過數字之和最的路徑

題目:EPI int max_fishing(vector<vector<int>> A) { if (A.empty() || A[0].empty()) throw new exception; for (int i = 0; i &l

微信裡面的簽到加積分介面(已經測試過沒問題)服務號不能每天傳送訊息,為了避免這個,每天簽到的時候,推最新的訊息給客戶。

  public string QianDao(string WeiXinId, string key)//引數是微訊號         {             strs = WeiXinId.Trim() + "WJXFGCLN+Mihaha";          

求某列最值資料對應的那資料

最近設計一個事務處理,遇到一個Sql語句怎麼都寫不出啦,試了很多次才實現,因此在此記錄分享一下。 業務是這樣的:求書的表中的價格最高的那本書的詳細資訊; 表books中有三個欄位,isbn,boo

Sql Server exists 查詢相同姓名或編號 年份最資料

select code,zw,zj,year from ZW a where not exists(select 1 from ZW where code=a.code and year>a.year) 對ZW表進行掃描,編號(或姓名)相同情況下,沒有比前邊年份大的資

SQL針對單列刪除重複資料只保留id最的資料

delete from t_student  where id in ( SELECT id from (SELECT * from t_student  where  name in (select name  from t_student where  name i

sql 查詢相同記錄下日期最

create table cangku ( F_RQ datetime, F_BH VARCHAR(20), F_SL FLOAT )INSERT INTO cangku VALUES('2012-05-31','C001',343) INSERT INTO cangku VALUES('2012-05-30

MySQL語句:獲取最後記錄(ID數值最的) - - Java EE

使用升序排序,將ID數值最大的放到最頂部。並顯示出來。 order by % desc 表示按降序排序 在sql語句的最後加上 limit 0,1 只取第一條記錄 select * from 表名 order by 表中ID欄位名稱 desc limit 0,1;