長樂國慶集訓Day3

来源:https://www.cnblogs.com/I-Love-You-520/archive/2019/10/03/11619429.html
-Advertisement-
Play Games

T1 動態逆序對 題目 【題目描述】 給出一個長度為n的排列a(1~n這n個數在數列中各出現1次)。每次交換兩個數,求逆序對數%2的結果。 逆序對:對於兩個數a[i],a[j](i<j),若a[i]>a[j],則(a[i],a[j])為1個逆序對。 【輸入格式】 第一行一個正整數n。 接下來一行n個 ...


T1 動態逆序對

題目

【題目描述】

給出一個長度為n的排列a(1~n這n個數在數列中各出現1次)。每次交換兩個數,求逆序對數%2的結果。

逆序對:對於兩個數a[i],a[j](i<j),若a[i]>a[j],則(a[i],a[j])為1個逆序對。

【輸入格式】

第一行一個正整數n。

接下來一行n個數,表示給出的排列a。

接下來一行一個正整數q。

接下來q行,每行兩個正整數i,j,表示交換a[i]和a[j]。

【輸出格式】

輸出共q行,表示每次交換後的逆序對數%2的結果。

【輸入樣例】

4
1 2 3 4
2
1 2
1 2

【輸出樣例】

1
0

【數據規模】

對於60%的數據:n,q≤100;

對於80%的數據:n,q≤1000;

對於100%的數據:n,q≤100000。

解析

先求出初始序列的逆序對總數對2取餘的結果。

每次交換a[i]與a[j](i<j),對於a[k]的影響如下:

  • 若k<i,a[k]依舊在a[i]與a[j]前面,所以a[k]與a[i]、a[j]產生的逆序對數不變;
  • 若k>j,同上,逆序對數不變;
  • 若i<k<j,如果a[i]<a[k],則逆序對數+1,否則-1,;如果a[j]>a[k],則逆序對數+1,否則-1,

而我們只需求出逆序對數對2取餘的結果,可以發現,逆序對個數的奇偶性與k無關。

事實上,只需在每次交換位置時,令逆序對總數對2取餘的結果^1即可(i=j時則不變)。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
using namespace std;
inline int read()
{
    int num=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        num=(num<<1)+(num<<3)+ch-'0';
        ch=getchar();
    }
    return num*w;
}
int n,q,a[100100],f[100100],temp;
void add(int x,int y)
{
    for(;x<=n;x+=(x&-x)) f[x]+=y;
}
int ask(int x)
{
    int ans=0;
    for(;x;x-=(x&-x)) ans+=f[x];
    return ans;
}
int main()
{
    //freopen("lyk.in","r",stdin);
    //freopen("lyk.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++) a[i]=read();
    q=read();
    for(int i=n;i>=1;i--)
    {
        temp+=ask(a[i]-1);
        add(a[i],1);
    }
    temp&=1;
    for(int i=1;i<=q;i++)
    {
        int x=read(),y=read();
        if(x!=y) temp^=1;
        cout<<temp<<endl;
    }
    return 0;
}
View Code

 

 

 

 

 

T2 樹的統計

題目

【題目描述】

給出一棵n個點的滿二叉樹,根節點為1,第i個點的左右子節點分別為第2i,2i+1個點,第i個點的權值為a[i]。

有m個詢問。對於每個詢問給出x,d,求到點x的距離為d的所有點的點權和。如果不存在符合條件的點,輸出0。

兩點距離即兩點間最短路徑的邊數。

保證最終答案在int範圍內。

【輸入格式】

第一行兩個正整數n,m。

接下來n行每行一個正整數,第i行的數表示a[i]。

接下來m行每行兩個整數x,d,表示一個詢問。

【輸出格式】

對於每個詢問輸出一行表示答案。

【輸入樣例】

7 3
13
7
2
9
5
6
8
1 3
4 2
3 1

【輸出樣例】

0
18
27

【數據規模】

對於80%的數據,n≤1023,m≤1000。

對於100%的數據,n≤131071,m≤100000,n=2t-1,1≤t≤17,a[i]≤30000。

解析

對於每個詢問,用dfs搜索與點x距離為d的點,進行統計即可。

註意每個點之間的關係,訪問父親是x<<1,左兒子是x>>1,右兒子是x>>1+1,要特判一下左右兒子編號不能大於n,否則會RE。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
inline int read()
{
    int num=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        num=(num<<1)+(num<<3)+ch-'0';
        ch=getchar();
    }
    return num*w;
}
const int N=131073;
int n,m,a[N],dd,ans;
void dfs(int x,int d,int from)
{
    if(d>dd) return ;
    if(d==dd)
    {
        ans+=a[x];
        return ;
    }
    int y=x>>1;
    if(y>=1&&y!=from) dfs(y,d+1,x);
    y=x<<1;
    if(y<=n&&y!=from) dfs(y,d+1,x);
    if(y+1<=n&&y+1!=from) dfs(y+1,d+1,x);
}
int main()
{
    //freopen("dream.in","r",stdin);
    //freopen("dream.out","w",stdout);
    n=read(),m=read();
    a[1]=read();
    for(int i=2;i<=n;i++) a[i]=read();
    for(int i=1;i<=m;i++)
    {
        int x=read();
        dd=read(),ans=0;
        dfs(x,0,0);
        cout<<ans<<endl;
    }
    return 0;
}
View Code

 

 

 

 

 

T3 宣傳欄

題目

【題目描述】

有一個大型的矩形宣傳欄,高和寬分別為h和m。宣傳欄是用來張貼告示的地方,最初,宣傳欄是空的,但此後告示將一張一張的被放上去。

有n張告示,每張告示的高都是一個單位長度,第i張貼上的告示寬度為w[i]。

每次張貼時,總是將告示貼在可以張貼且最高的地方,如果有多個可行的地方,則選擇最左邊張貼。

給定宣傳欄的高和寬,你的任務是找出每個告示張貼在第幾行。

【輸入格式】

第一行為三個整數,h,m和n(1≤m≤109;1≤h≤n≤200000),表示宣傳欄的尺寸和張貼的告示個數。

接下來n行表示w[i](1≤w[i]≤109)。

【輸出格式】

每行一個整數表示答案。如果第i個告示沒地方貼,輸出-1。

【輸入樣例】

3 5 5
2
4
3
3
3

【輸出樣例】

1
2
1
3
-1

【數據規模】

對於20%的數據,n=1。

對於40%的數據,n,m≤500。

對於70%的數據,n≤2000。

對於90%的數據,n≤50000。

對於100%的數據,n≤200000。

解析

用c[i]表示第i行還剩多少長度。

用線段樹維護c[i]的區間最大值即可。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
inline int read()
{
    int num=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        num=(num<<1)+(num<<3)+ch-'0';
        ch=getchar();
    }
    return num*w;
}
int h,m,n,c[800100];
int w;
void build(int p,int l,int r)
{
    c[p]=m;
    if(l==r) return ;
    int mid=(l+r)>>1;
    build(p*2,l,mid),build(p*2+1,mid+1,r);
}
int ask(int p,int l,int r)
{
    if(l==r)
    {
        c[p]-=w;
        return l;
    }
    int mid=(l+r)>>1;
    if(c[p*2]>=w)
    {
        int temp=ask(p*2,l,mid);
        c[p]=max(c[p*2+1],c[p*2]);
        return temp;
    }
    else
    {
        int temp=ask(p*2+1,mid+1,r);
        c[p]=max(c[p*2+1],c[p*2]);
        return temp;
    }
}
int main()
{
    //freopen("billboard.in","r",stdin);
    //freopen("billboard.out","w",stdout);
    h=read(),m=read(),n=read();
    build(1,1,h);
    for(int i=1;i<=n;i++)
    {
        w=read();
        if(w>c[1])
        {
            cout<<"-1"<<endl;
            continue;
        }
        cout<<ask(1,1,h)<<endl;
    }
    return 0;
}
View Code

 

 

 

 

 

T4 種樹

題目

【題目描述】

你要在一條無窮長的馬路上種樹。

你想種3種樹,分別是草莓樹,西瓜樹,土豆樹。

給定3個正整數A,B,C,你可以選擇3個整數x,y,z,然後:

  • 在位置 … , x-2A , x-A , x , x+A , x+2A , … 分別種1棵草莓樹。
  • 在位置 … , y-2B , y-B , y , y+B , y+2B , … 分別種1棵西瓜樹。
  • 在位置 … , z-2C ,z-C , z , z+C , z+2C , … 分別種1棵土豆樹。

你想要最大化最近的兩棵樹的距離,請你輸出這個最大距離。

【輸入格式】

每個測試點多組測試數據。

每組數據輸入一行A,B,C。

沒給出數據組數,你可以這樣輸入:

while (scanf(“%d%d%d”, &A, &B, &C) == 3)

{

       ……

}

【輸出格式】

對於每個詢問輸出一行表示答案。

【輸入樣例】

1 5 8
3 3 6
2000 2000 2000
999 999 999
233 233 233
100 100 100
40 30 20

【輸出樣例】

0
1
666
333
77
33
5

【數據規模】

對於100%的數據,1≤A,B,C≤2000。

解析

先用solve函數求出三樹兩兩之間最小距離的最小值,然後再找到最大的即可。

證明過程比較麻煩,本蒟蒻數論不太好,就不給出詳細證明瞭。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int a,b,c,x,y,z,ans;
int gcd(int x,int y)
{
    if(y==0) return x;
    return gcd(y,x%y);
}
int solve(int a,int b,int x,int y)
{
    int g=gcd(a,b);
    int t=(x-y)%g;
    if(t<0) t+=g;
    return min(t,g-t);
}
int main()
{
    while(cin>>a>>b>>c)
    {
        ans=0;
        for(y=0;y<b;y++)
            for(z=0;z<c;z++)
            {
                int temp;
                temp=min(solve(a,b,0,y),min(solve(b,c,y,z),solve(a,c,0,z)));
                ans=max(ans,temp);
            }
        cout<<ans<<endl;
    }
    return 0;
}
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 命令模式(Command): 將請求封裝成對象,以便使用不同的請求、日誌、隊列等來參數化其他對象。命令模式也支持撤銷操作。 命令模式的角色: 1)傳遞命令對象(Invoker):是請求的發送者,它通常擁有很多的命令對象,並通過訪問命令對象來執行相關請求,它不直接訪問接收者。 2)抽象命令介面(Com ...
  • 使用Python內置函數:bin()、oct()、int()、hex()可實現進位轉換。 先看Python官方文檔中對這幾個內置函數的描述: bin(x)Convert an integer number to a binary string. The result is a valid Pytho ...
  • "Flask的使用以及返回值(其中Response後續詳細單獨補充)" "Flask的路由解讀以及其配置" "Flask的請求擴展" "Flask中的cookie和session" "Flask中的request和response" "Flask中的渲染變數" "Flask中的CBV以及正則表達式" ...
  • 第一次寫博客,正好在回顧Java的時候用到了比較器,記錄一下使用的方法。 Java比較器多用於對象數組的排序,主要用到comparable和comparator介面 1、使用comparable介面 首先將需要實現排序對象的類實現comparable介面,實現後覆寫comparaTo(T other ...
  • 1、HashMap源碼解析(JDK8) 基礎原理: 對比上一篇《Java中的容器(集合)之ArrayList源碼解析》而言,本篇只解析HashMap常用的核心方法的源碼。 HashMap是一個以鍵值對存儲的容器。 hashMap底層實現為數組+鏈表+紅黑樹(鏈表超過8時轉為紅黑樹,JDK7為數組+鏈 ...
  • 我們將生產者、消費者、庫存、和調用線程的主函數分別寫進四個類中,通過搶奪非線程安全的數據集合來直觀的表達在進行生產消費者模型的過程中可能出現的問題與解決辦法。 我們假設有一個生產者,兩個消費者來共同搶奪庫存里的資源,而生產者和消費者都以線程來實現。 庫存對象只有是唯一的才會出現搶奪一個資源的可能,所 ...
  • vue實現選擇圖片文件後預覽 利用h5的api可以實現選擇文件並實現預覽 readAsDataURL 方法會讀取指定的 Blob 或 File 對象。讀取操作完成的時候,readyState 會變成已完成DONE,並觸發 loadend 事件,同時 result 屬性將包含一個data:URL格式的 ...
  • 面向對象三大特性:封裝、繼承、多態 繼承的概念: 在定義類時,可以從已有類當中提取想要的內容 被繼承的類稱為父類、基類、超類,新定義的類稱為子類、派生類 註意:如果派生類中的屬性與基類屬性重名,那麼派生類的屬性會覆蓋掉基類的屬性。包括初始化函數。 派生類在初始化函數中需要繼承和修改初始化過程,使用’ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...